2015-08-26 5 views
3

данной VARIADIC шаблоны структуры данных, как показано ниже (код из Eli Bendersky's website):VARIADIC шаблоны VARIADIC шаблонов класса в C++

template <class... Ts> struct tuple {}; 

template <class T, class... Ts> 
struct tuple<T, Ts...> : tuple<Ts...> { 
    tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {} 

    T tail; 
}; 

мы можем определить что-то вроде

tuple<double, uint64_t, const char*> t1(12.2, 42, "big"); 

Тогда как определить структура шаблона, которая могла бы принять следующую подпись?

Foo<tuple<int,double>, tuple<double,int,long> ..., tuple<std::string>> foo; 

Я думаю, что это будет так:

template<tuple<class... Ts>... Tuples> 
struct VariadicTuples {}; 

, но он не может скомпилировать. заключается в том, что, поскольку класс в шаблонах Variadic не может быть шаблонами Variadic? Если да, то как это сделать?

+1

В вашем примере с 'Foo' вы не передаете сам шаблон, а инициализируете его. 'template struct Foo;' достаточно для компиляции. – Quentin

ответ

4

Вы просто не можете писать это синтаксически. Что бы Ts удержать в этой ситуации? Было бы по-разному для каждого типа в Tuples, так что это было бы небезопасно.

Что вы можете сделать вместо этого воспользоваться bool_pack трюк Columbo в:

template <bool...> struct bool_pack; 

template <bool... v> 
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>; 

Чтобы просто static_assert, что все Tuples являются, по сути, tuple s и затем VariadicTuples быть простой шаблон VARIADIC класс:

template <typename > struct is_a_tuple : std::false_type { }; 
template <typename... T> struct is_a_tuple<tuple<T...>> : std::true_type { }; 

template <typename... Tuples> 
struct VariadicTuples { 
    static_assert(all_true<is_a_tuple<Tuples>::value...>::value, "!"); 
}; 
+0

, который отлично работает. Благодаря! – qqibrow

Смежные вопросы