Я в настоящее время борется со следующим кодом, целью которого является реализация VARIADIC VARIADIC шаблона:VARIADIC шаблоны VARIADIC шаблона
template
<
template <typename... HeadArgs> class Head,
template <typename... TailArgs> class...
>
struct join<Head<typename HeadArgs...>, Head<typename TailArgs...>...>
{
typedef Head<typename HeadArgs..., typename TailArgs......> result;
};
В идеале, я бы иметь возможность использовать этот шаблон metafunction для достижения следующее:
template <typename...> struct obj1 {};
template <typename...> struct obj2 {};
typedef join
<
obj1<int, int, double>,
obj1<double, char>,
obj1<char*, int, double, const char*>
>::result new_obj1;
typedef join
<
obj2<int, int, double>,
obj2<double, char>,
obj2<char*, int, double, const char*>
>::result new_obj2;
/* This should result in an error, because there are
different encapsulating objects
typedef join
<
obj1<int, int, double>,
obj1<double, char>,
obj2<char*, int, double, const char*>
>::result new_obj;
*/
выход выше, мы надеемся создать new_obj1
и new_obj2
в виде template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};
Я использую gcc 4.6.2 в Windows, который выводит «ожидаемый пакет параметров до« ... »для расширения« Head<typename TailArgs...>
... ».
This error is reproducable with gcc 4.5.1.
Аргумент * имя * внутри 'template' спецификация шаблона шаблон аргумент является необязательным и полностью косметическим; он фактически не доступен как реальный параметр. –
@KerrekSB есть ли способ получить параметры шаблона шаблона? – kmore
Я отредактировал мой пост; Мне не хватало вариационного случая. В ответ на ваш вопрос: Да, предоставив явный шаблонный параметр (пакет) и соответствие. –