Как передать шаблон в качестве шаблона в шаблон?
Я пытаюсь написать что-то вроде:
// I don't know how this particular syntax should look...
template<typename template<typename Ty> FunctorT>
Something MergeSomething(const Something& lhs, const Something& rhs)
{
Something result(lhs);
if (lhs.IsUnsigned() && rhs.IsUnsigned())
{
result.SetUnsigned(FunctorT<unsigned __int64>()(lhs.UnsignedValue(), rhs.UnsignedValue()));
}
else
{
result.SetSigned(FunctorT<__int64>()(lhs.SignedValue(), rhs.SignedValue()));
}
return result;
}
который будет использоваться как:
Something a, b;
Something c = MergeSomething<std::plus>(a, b);
Как это сделать?
Ответы
Ответ 1
Это просто "аргумент шаблона шаблона". Синтаксис очень близок к тому, что вы себе представляете. Вот он:
template< template<typename Ty> class FunctorT>
Something MergeSomething(const Something& lhs, const Something& rhs)
{
Something result(lhs);
if (lhs.IsUnsigned() && rhs.IsUnsigned())
{
result.SetUnsigned(FunctorT<unsigned __int64>()(lhs.UnsignedValue(), rhs.UnsignedValue()));
}
else
{
result.SetSigned(FunctorT<__int64>()(lhs.SignedValue(), rhs.SignedValue()));
}
return result;
}
Ваш прецедент должен работать так, как вы его разместили.
Ответ 2
То, как вы его используете, является правильным. Но само определение самого шаблона функции неверно.
Это должно быть так:
template<template<typename Ty> class FunctorT> //<---here is the correction
Something MergeSomething(const Something& lhs, const Something& rhs)
И Ty
не требуется. На самом деле, это бессмысленно. Вы можете полностью опустить его.
См. статью Стивена К. Девхерста: