2017-02-21 22 views
1

У меня есть VARIADIC шаблонного класса, который определяет набор типовссылка VARIADIC шаблон параметры пакет из другого шаблона

template <typename ... Types> class TypePack { }; 

который конкретизируется в несколько раз

typedef TypePack<T1, T2, T3> Pack1; 
typedef TypePack<T1, T2, T4> Pack2; 

Я хочу ссылаться TypePack параметров из других шаблонов

template <typename Pack> Client { 
    static constexpr std::array<Foo, sizeof...(Pack::Types)> foos { 
     make_foo<Pack::Types>()... 
    }; 
}; 
typedef Client<Pack1> Client1; 
typedef Client<Pack2> Client2; 

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

я мог определить Pack1 и Pack2 через макросы, но у меня есть ощущение, что это должно быть возможно сделать это с переменным числом шаблонов в C++ 14

+0

@Barry: Очевидно, член, вопрос, являются ли данные члена или функция-член. –

ответ

7

Что вы ищете частичная специализация:

template <typename Pack> struct Client; 

template <class... Ts> 
struct Client<TypePack<Ts...>> 
{ 
    static constexpr std::array<Foo, sizeof...(Ts)> foos {{ 
     make_foo<Ts>()... 
    }}; 
}; 

// don't forget the definition 
template <class... Ts> 
constexpr std::array<Foo, sizeof...(Ts)> Client<TypePack<Ts...>>::foos; 
+2

Я бы точно хотел знать, почему это было приостановлено ... – Angew

+1

@ T.C. Что, вы подразумеваете, что функции нуждаются в именах? C++ настолько требовательна. – Barry

+1

Я думаю, что вопрос состоял в том, чтобы определить элемент данных, а не функцию. С отсутствующим * declarator-id * трудно сказать, но отсутствие ключевого слова 'return' и наличие следующей точки с запятой, которую не должна иметь функция-член, сильно зависит от того, что фигурные скобки являются скобками или -equal-initializer, а не тело функции. –