3

这是运行良好的代码:

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

但这不起作用,但为什么?

非常感谢任何帮助:)

编辑:根据答案编辑解决方案。

4

2 回答 2

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

不是专业的

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

这说dd总是需要至少一个参数。


旁注,已经有一种内置方法可以获取可变参数模板参数的数量,并且该count结构可以实现为

template <class ...args>
struct count
{
    static const int value = sizeof...(args);
};
于 2011-10-09T12:17:55.540 回答
2

template <typename T, typename... Args>你不能创建一个省略 (ie) 的专业化——Tdd<>可以是空的,但T不能。因此,您将模板声明为只需要一个包的模板,专门针对空包以停止递归,并部分专门针对<T, Args...>解包一种类型并创建一个具有 (n - 1) 种类型的新包。

至于编辑:您不能定义具有不同参数但名称相同的另一个模板,您必须专门化已经存在的模板。

于 2011-10-09T12:17:06.537 回答