void
与任何其他类型一样(准确地说,是一个不完整的类型)。这意味着它通常可以用作类型模板参数的模板参数。以您的类模板为例,这些都是完全有效的,并且
实例化:
some_class<void>
some_class<void, void>
some_class<void, void, void>
some_class<void, char, void>
在第一种情况下,参数包
Args
无效的
. 在第二种情况下,它有两个要素:
无效的
和
. 等等
这与实际情况大不相同
some_class<>
,在这种情况下,参数包具有
零
元素。您可以使用
sizeof...
template <class... Pack>
struct Sizer
{
static constexpr size_t size = sizeof...(Pack);
};
int main()
{
std::cout << Sizer<>::size << ' ' << Sizer<void>::size << ' ' << Sizer<void, void>::size << std::endl;
}
这将输出:
[Live example]
我真的想不出引用标准的相关部分。可能是这样(C++11[temp.variadic]14.5.3/1):
A.
模板参数包
是接受零个或多个模板参数的模板参数。[
例子:
template<class ... Types> struct Tuple { };
Tuple<> t0; // Types contains no arguments
Tuple<int> t1; // Types contains one argument: int
Tuple<int, float> t2; // Types contains two arguments: int and float
Tuple<0> error; // error: 0 is not a type