2011-10-09 2 views
3

Вот код, который работает отлично:VARIADIC шаблоны тайны

template<typename... Args> struct count; 

template<> 
struct count<> { 
static const int value = 0; 
}; 

template<typename T, typename... Args> 
struct count<T, Args...> { 
static const int value = 1 + count<Args...>::value; 
}; 

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

Можем ли мы сделать что-то вроде:

template< typename... args> struct dd; // edited according to answer but now getting error redeclared with 2 template parameters which is point below with mark %% 

template<> 
struct dd<>{ 
static const int value = 0; 
}; 

template<typename T, typename... args> //%% 
struct dd{ 
static const int value= 1+ dd<args...>::value; 
}; 

, но это не работает, но почему?

Любая помощь очень ценится :)

Edit: редактировал решение в соответствии с ответом.

+1

Обратите внимание, что вы можете сделать 'SizeOf (арг)' чтобы получить счет. –

ответ

2

С template <typename T, typename... Args> Вы не можете создать специализацию, которая опускает T (т.е. dd<>) - пакет может быть пустым, но T не может. Таким образом, вы объявляете шаблон как тот, который принимает только пакет, специализируется на пустом пакете для остановки рекурсии и частично специализируется на <T, Args...>, чтобы распаковать один тип и создать новый пакет с (n - 1) типами.

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

5
template<> 
struct dd<> { 
static const int value = 0; 
}; 

не специализация

template< typename T,typename... args> struct dd; 

, который говорит dd всегда потребуется, по крайней мере, один параметр.


Sidenote, уже есть встроенный способ получить количество переменного числа параметров шаблона и count структуры может быть реализована как

template <class ...args> 
struct count 
{ 
    static const int value = sizeof...(args); 
}; 
+0

так что если что-то вроде 'template struct dd;' как первичный шаблон во втором коде, он должен работать ?. Я все еще не могу понять ваш ответ, переделать его, пожалуйста. Спасибо –

+0

@ Mr.Anubis Да, тогда это сработает (будучи таким же, как ваш первый фрагмент). – UncleBens

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

  • Нет связанных вопросов^_^