【发布时间】:2011-10-10 20:41:35
【问题描述】:
我之前也问过类似的问题,知道我可以通过部分专业化来使其工作。但是为了理解可变参数模板的基础知识,我修改了这样的代码。
template<typename T, typename... args>
struct counter{
static const int value= 1+ counter<args...>::value;
};
template<typename T>
struct counter<T>{
static const int value = 0;
};
错误:“抱歉,未实现:无法将 'args ...' 扩展为固定长度的参数列表”
我知道这是错误,已在 gcc 4.7.0 中修复
所以要解决所有这些问题,我们必须使用技巧或其他方法,这是对模板的部分特化。
template<typename... Args> struct counter;
template<>
struct counter<> {
static const int value = 0;
};
template<typename T, typename... Args>
struct counter<T, Args...> {
static const int value = 1 + counter<Args...>::value;
};
实际问题:所以我真的很想知道部分专业化在这里有什么特殊效果以便代码起作用,或者我应该问部分专业化如何解决这个问题? (为什么第二个版本没有遇到bug?)。任何有关动机问题和示例的解释都会非常有帮助。
【问题讨论】:
-
请不要告诉我使用
sizeof...(args) -
+1: "编译器道歉"...不是每天都看到。
-
等等,为什么第二个版本是“诡计”?第一个版本同样使用部分特化。并且可以说第二个版本更干净、更强大,所以我一开始就不会考虑第一个版本。
-
第一个版本不能接受 0 个参数(并且报告的参数比它应该的少 1 个)。
-
@Mr.Anubis:“请不要告诉我使用 sizeof...(args)” 为什么不呢?这就是你应该如何获得参数计数。
标签: c++ c++11 variadic-templates