函数one()接受一个参数包.函数二()接受两个.每个包都被约束为包裹在类型A和B中.为什么不可能实例化两个()?
template <typename T>
struct A {};
template <typename T>
struct B {};
template <typename... Ts>
void one(A<Ts> ...as) {
}
template <typename... Ts, typename... Us>
void two(A<Ts> ...as, B<Us> ...bs) {
}
int main() {
auto a = A<int>();
auto b = B<int>();
// Just fine
one();
one(a);
one(a, a);
// All errors
two();
two(a);
two(a, b);
}
Run Code Online (Sandbox Code Playgroud)
试过gcc和clang.
sam@wish:~/x/cpp$ gcc -std=c++0x variadic_templates.cpp
variadic_templates.cpp: In function ‘int main()’:
variadic_templates.cpp:23:7: …Run Code Online (Sandbox Code Playgroud) 在这篇文章的答案" (部分)专门化依赖类型的非类型模板参数 "中,它指出:
与专用非类型参数对应的模板参数的类型不应取决于特化的参数.[例如:
Run Code Online (Sandbox Code Playgroud)template <class T, T t> struct C {}; template <class T> struct C<T, 1>; // error template< int X, int (*array_ptr)[X] > class A {}; int array[5]; template< int X > class A<X,&array> { }; // error- 末端的例子]
我的问题是为什么这个限制在这里?至少有一个用例,我发现这个限制干扰了编写干净的代码.例如
template <typename T, T*>
struct test;
template <typename T>
struct test<T, nullptr> // or struct test<T, (T*)nullptr>
{
};
template <typename R, typename...ARGs, R(*fn)(ARGs...)>
struct test<R(ARGs...), fn>
{
};
Run Code Online (Sandbox Code Playgroud)
虽然我不确定是否还有其他案例表明基于类型的常量是一个超出没有任何意义的问题.
任何人都有理由说明为何如此?