c++ - 成员函数模板,其参数数量取决于一个完整的模板参数

标签 c++ function parameters c++11

我有以下类模板:

template<class T, unsigned N>
class MyClass;

在哪里 T是某种类型,N - 组件的数量。可以使用 MyClass{a1, a2, a3} 初始化类其中参数的数量等于 N .

我想添加 foo 的成员函数模板(我们将其命名为 MyClass)满足以下要求:

  1. 它被另一种类型模板化 T2 (即 template<class T2> void foo(..) )
  2. 它接受足够的数据来构造 MyClass<T,N> ,但不多也不少。违反此规则会导致编译时错误。
  3. 推导出 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);

Check it

我猜 Gcc 4.7.0 快照有一些模板错误,如果你用 gcc 4.6.2/1 试试它应该可以工作。

关于c++ - 成员函数模板,其参数数量取决于一个完整的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100680/

相关文章:

c++ - wxWidget v2.8 软件。让它与 3.0 库一起使用?

c++ - 枚举和函数

android - 带有参数的 Kotlin lambda 的 Mocktito ArgumentCaptor

c++ - 无法在另一个类的迭代器类中使operator <<

c++ - 带有单个发送消息的 ComboBox 项目选择

c++ - 有没有办法在C++中静态初始化动态分配的数组?

javascript - 调用函数时出现意外的 token } 错误

java - 如何从父类(super class)获取参数?

c - C 语言中没有类型的函数参数

sql - 如何创建一个可以选择搜索列的存储过程?