如何仅在给定n个以上参数的情况下启用可变模板构造函数_if
How do I enable_if a variadic template constructor only if more than n arguments are given?
我有一个带有以下构造函数的类:
template<typename T>
class MyClass {
public:
MyClass() = default;
explicit MyClass(T val) : value_1(val) { /* ... */ }
explicit MyClass(T val, T val2) : value_1(val), value_2(val2) { /* ... */}
private:
T value_1 = 0;
T value_2 = 0;
};
我还想创建一个构造函数,它接受任意数量的参数(所有参数都可以是T
的)。构造函数也不能覆盖我已经写过的其他构造函数,因为完成的工作是不同的。我试了一下enable_if
,但无法使其发挥作用。以下是我目前所拥有的:
template<typename... TArgs>
explicit MyClass(TArgs... mArgs, typename std::enable_if<sizeof...(mArgs) >= 3>) { /* ... */ }
然而,当这样调用时:
MyClass<double>(2, 3, 4, 5, 6, 7);
它产生了这个错误(以及其他错误):
error: no matching function for call to 'MyClass<double>::MyClass(int, int, int, int, int, int)'
所以编译器可能根本看不到构造函数。另一方面,如果我忽略了enable_if
,它将永远不会调用我的其他更专业的构造函数。
简言之,如何使可变构造函数被称为当且仅当有三个或多个参数给定给构造函数?
编辑:
正如评论中所建议的,我现在也尝试了以下方法,但也不起作用:
template<typename... TArgs>
explicit MyClass(TArgs... mArgs, typename std::enable_if<sizeof...(mArgs) >= 3>::type) { /* ... */ }
以及
template<typename... TArgs>
explicit MyClass(TArgs... mArgs, typename std::enable_if<sizeof...(mArgs) >= 3>* = nullptr) { /* ... */ }
或两者的任意组合。
建议:尝试
template <typename... TArgs,
typename = typename std::enable_if<sizeof...(TArgs) >= 3>::type>
explicit MyClass(TArgs... mArgs) { /* ... */ }
或者更好(以避免与具有相同签名的多个启用SFINAE的构造函数发生冲突)。
template <typename... TArgs,
typename std::enable_if<sizeof...(TArgs) >= 3, bool>::type = true>
explicit MyClass(TArgs... mArgs) { /* ... */ }
你的原始代码的问题
template<typename... TArgs>
explicit MyClass(TArgs... mArgs, typename std::enable_if<sizeof...(mArgs) >= 3>::type) { /* ... */ }
只有当相对参数位于最后一个位置时,您才能推导出类型的可变列表。
如果您添加另一个参数
typename std::enable_if<sizeof...(mArgs) >= 3>::type
您打破了TArgs...
类型的推导。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 在我的 CLR 项目中添加包含会导致无法在启用 /clr 的情况下编译 WLR
- OpenCL 矢量类型:在启用 C++11 的情况下无法访问联合组件 x,y,z
- 我如何在不启用例外的情况下构建Boost 1.70.0
- 当我尝试在启用推理引擎的情况下编译 OpenCv 时,出现错误
- 如何仅在给定n个以上参数的情况下启用可变模板构造函数_if
- 如何消除只在启用优化的情况下出现的错误
- 在启用 OpenCL 选项的情况下使用 Tesseract 时出现 malloc 错误
- 在启用OpenCL选项的情况下使用Tesseract时出错
- 在启用 SSL 的情况下构建 libircclient 时对 'DLopen' 的未定义引用
- 如何在启用ARC的情况下将Objective-C代码转换为C++
- 如何在<functional>启用 C++11 的情况下在 Xcode 4.6.2 中进行编译
- 如何在boost::date_time中启用纳秒的情况下使用boost:;thread::timed_join
- 在不更改成员范围的情况下有条件地启用静态成员