Подтвердить что ты не робот

Как передать шаблон в качестве шаблона в шаблон?

Я пытаюсь написать что-то вроде:

          // 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);

Как это сделать?

4b9b3361

Ответ 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 не требуется. На самом деле, это бессмысленно. Вы можете полностью опустить его.

См. статью Стивена К. Девхерста: