Variadic шаблоны загадка - PullRequest
       1

Variadic шаблоны загадка

3 голосов
/ 09 октября 2011

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

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;
};

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

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

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;
};

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

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

Редактировать : редактировать решение в соответствии с ответом.

Ответы [ 2 ]

5 голосов
/ 09 октября 2011
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);
};
2 голосов
/ 09 октября 2011

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

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

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