考虑以下人为例子:
template <typename T, typename... Args>
struct A {
typedef T Type;
};
将A
与一个或多个参数一起使用时,如果使用零参数,则按预期方式失败:
错误:模板参数数量错误(0,应为1或更多)
如果没有参数,是否可以使A
处理定义A::Type
到int
的零模板参数的情况,如果有的话,是否可以处理第一个模板参数?
答案 0 :(得分:13)
首先将主模板定义为最常见的情况 - 其中还包括零参数:
template <typename... Args> //general : 0 or more
struct A { using Type = int; }
然后部分将 1个或更多参数专门化为:
template <typename T, typename... Args> //special : 1 or more
struct A<T,Args...> { using Type = T; }
一旦你有这个专业化,主模板将用于零参数 !
请注意,数学 1或更多是 0或更多的特殊情况 - 后者是更常见的情况(不是相反)< / em>的
答案 1 :(得分:7)
您只需在第一个参数中添加默认值,无需专门化:
#include <type_traits>
template <typename T = int, typename... >
struct A {
using type = T;
};
int main() {
static_assert(std::is_same<A<>::type, int>::value, "");
static_assert(std::is_same<A<double, char>::type, double>::value, "");
}