相关疑难解决方法(0)

如何在可变参数模板中包含多个参数包?

函数one()接受一个参数包.函数二()接受两个.每个包都被约束为包裹在类型AB中.为什么不可能实例化两个()

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)

c++ variadic-templates c++11

49
推荐指数
4
解决办法
2万
查看次数

为什么标准不允许在模板参数列表中初始化常量依赖类型?

在这篇文章的答案" (部分)专门化依赖类型的非类型模板参数 "中,它指出:

与专用非类型参数对应的模板参数的类型不应取决于特化的参数.[例如:

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
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

我的问题是为什么这个限制在这里?至少有一个用例,我发现这个限制干扰了编写干净的代码.例如

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)

虽然我不确定是否还有其他案例表明基于类型的常量是一个超出没有任何意义的问题.

任何人都有理由说明为何如此?

c++ templates template-meta-programming c++11 c++14

34
推荐指数
1
解决办法
1179
查看次数