C++ 如果变量模板构造函数仅在给定n个以上参数时才启用_,该如何启用?

C++ 如果变量模板构造函数仅在给定n个以上参数时才启用_,该如何启用?,c++,c++11,variadic-templates,sfinae,template-argument-deduction,C++,C++11,Variadic Templates,Sfinae,Template Argument Deduction,我有一个包含以下构造函数的类: 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_

我有一个包含以下构造函数的类:

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;
};
但是,当这样称呼时:

MyClass<double>(2, 3, 4, 5, 6, 7);
以及

template<typename... TArgs>
explicit MyClass(TArgs... mArgs, typename std::enable_if<sizeof...(mArgs) >= 3>* = nullptr) { /* ... */ }
模板
显式MyClass(targets…mArgs,typename std::enable_if=3>*=nullptr){/*…*/}
或者两者的任意组合。

建议:尝试使用

template <typename... TArgs,
          typename = typename std::enable_if<sizeof...(TArgs) >= 3>::type>
explicit MyClass(TArgs... mArgs) { /* ... */ }
模板::类型>
显式MyClass(TArgs…mArgs){/*…*/}
或者更好(以避免与具有相同签名的多个支持SFINAE的构造函数发生冲突)

template::type=true>
显式MyClass(TArgs…mArgs){/*…*/}
原始代码的问题

template<typename... TArgs>
explicit MyClass(TArgs... mArgs, typename std::enable_if<sizeof...(mArgs) >= 3>::type) { /* ... */ }
模板
显式MyClass(targets…mArgs,typename std::enable_if=3>::type){/*…*/}
只有当相对参数位于最后一个位置时,才能推断出类型的可变列表

如果你再加一个论点

typename std::enable_if<sizeof...(mArgs) >= 3>::type
typename std::enable_if=3>::type

你打破了对
targets…
类型的推断。

可能的重复:我不确定这是否是问题所在,但是你的
enable\u if
应该是
std::enable\u if\u t
(如果使用C++14),或者应该使用
typename std::enable\u if::type
。如果没有
::type
,你就没有什么可怀疑的了。@FrançoisAndrieux没有。我已经尝试了从那个问题中提出的解决方案,但仍然产生了与我在问题中描述的相同的错误。我不可能将
enable_if
放在模板声明中(即在参数之前),由于我需要访问mArgs.@L.Kue,如果您尝试将
std::enable_If
作为模板参数,但无效,则应在此处显示您的尝试。@Bitwize我已更新了我的问题。这似乎是正确的解决方案。我不知道您可以对模板参数类型调用
sizeof…()
template <typename... TArgs,
          typename = typename std::enable_if<sizeof...(TArgs) >= 3>::type>
explicit MyClass(TArgs... mArgs) { /* ... */ }
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