Как передать шаблон как параметр шаблона в шаблон? - PullRequest
18 голосов
/ 13 июня 2011

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

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

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

Ответы [ 2 ]

19 голосов
/ 13 июня 2011

Это просто «шаблонный аргумент». Синтаксис очень близок к тому, что вы себе представляли. Вот оно:

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;
}

Ваш вариант использования должен работать так, как вы его опубликовали.

12 голосов
/ 13 июня 2011

То, как вы используете , это правильно. Но само определение шаблона функции неверно.

Должно быть так:

template<template<typename Ty> class FunctorT> //<---here is the correction
Something MergeSomething(const Something& lhs, const Something& rhs)

А Ty не нужен. На самом деле, это бессмысленно. Вы можете опустить его полностью.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...