Шаблон шаблона вариации в C ++ - PullRequest
3 голосов
/ 18 февраля 2012

Можно ли использовать шаблон variadic для перехвата всех случаев передачи параметра шаблона, который сам является шаблоном?

Я использовал шаблонизацию для получения отладочного вывода для некоторых методов на основе шаблона.Сначала я создал универсальный обработчик, затем специализировал его для собственных типов:

template<typename... PARAMS> struct TypeList{};

template<typename TYPE> inline void ntype(ostream &out, TypeList<TYPE>) {
    out << typeid(TYPE).name();
}

template<> inline void ntype(ostream &out, TypeList<int>) {
    out << "int";
}

...

Затем я попытался добавить второй формат шаблона для перехвата передаваемых типов:

template<typename ... SUB, template<typename...> class TYPE> void ntype(ostream &out, TypeList<TYPE<SUB...> >) {
    ntype(out, TypeList<typename TYPE>());
    out << '<';
    subtype(out, TypeList<SUB...>());
    out << '>';
}

Гдеподтип - это шаблонный метод, разработанный для рекурсии по списку параметров, по очереди применяя каждый к ntype ().

Проблема в том, что я пытаюсь вызвать это с чем-то с эффектом:

ntype<SomeClass<int> >(out, TypeList<SomeClass<int> >());

Это только когда-либо соответствует общей первой функции шаблона - никаких ошибок компиляции, но это никогда не соответствует версии шаблона шаблона.Я уверен, что это просто недостаток понимания с моей стороны, но результаты Google кажутся очень слабыми, когда дело доходит до четких примеров шаблонов шаблонов, и даже более тонкими в отношении переменных параметров шаблона.

МожетКто-нибудь объяснит, возможно ли то, что я пытаюсь сделать, и если да, то, что я делаю неправильно?

1 Ответ

1 голос
/ 18 февраля 2012

Похоже, у меня просто была опечатка - я добавил () после одного из моих списков типов в объявлении функции, вероятно, из-за копирования и вставки из вызова функции в 3 часа ночи, что вызывало несоответствие.

Итак, если кому-то интересно, да, это возможно, и вышесказанное является вполне приемлемым способом сделать это.

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