我有以下类模板:
template<class T, unsigned N>
class MyClass;
在哪里 T
是某种类型,N
- 组件的数量。可以使用 MyClass{a1, a2, a3}
初始化类其中参数的数量等于 N
.
我想添加 foo
的成员函数模板(我们将其命名为 MyClass
)满足以下要求:
- 它被另一种类型模板化
T2
(即template<class T2> void foo(..)
) - 它接受足够的数据来构造
MyClass<T,N>
,但不多也不少。违反此规则会导致编译时错误。 - 推导出
T2
从参数的类型来看。 IE。我希望可以调用foo({a1, a2, a3})
或foo(a1, a2, a3)
或类似的,无需输入<double>
或MyClass<double,N>
每次。
有没有办法实现该功能,从而满足上述要求?
我已经考虑和/或尝试过以下解决方案:
1) 显而易见的:
...
template<class T2>
void foo(MyClass<T2, N> arg);
...
a.foo({1,2,3}); //compile-time error
原则上不能工作,因为花括号初始化列表是非推导上下文,因此它们不能推导 任何 类型。太可惜了,如果能成功我会很高兴的。
2) initializer_list
原则上不能工作,因为它无法在编译时检查参数的数量。
3) 可变参数模板魔术
类似下面的函数会很简洁:
template<class...T2, class std::enable_if<sizeof...(T2) == N, int>::type = 0>
void foo(T2... args);
..
foo(1,2,3);
但是,我无法让它工作 - 仍然无法推断出 T2。也许有人知道为什么?我使用的是 GCC4.7 20120121 快照。
4) 丑陋的
本质上这与上面的相同,只是针对不同的 N 扩展了几个重载。我最好重新实现 MyClass
作为一组针对不同的专业 N
s 而不是使用这个。
template<class T2, class std::enable_if<N == 1, int>::type = 0>
void fun(T2 a1); //if N == 1
template<class T2, ..>
void fun(T2 a1, T2 a2); //if N == 2
template<class T2, ..>
void fun(T2 a1, T2 a2, T2 a3); //if N == 3
...
最佳答案
你的第三个变体的第二个非类型参数应该有前缀 typename
而不是 class
:
template<class...T2, typename std::enable_if<sizeof...(T2) == N, int>::type = 0>
void foo(T2... args);
..
foo(1,2,3);
我猜 Gcc 4.7.0 快照有一些模板错误,如果你用 gcc 4.6.2/1 试试它应该可以工作。
关于c++ - 成员函数模板,其参数数量取决于一个完整的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100680/