Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果使用相同的用法,则SFINAE启用_C++_Templates_C++17_Sfinae - Fatal编程技术网

C++ 如果使用相同的用法,则SFINAE启用

C++ 如果使用相同的用法,则SFINAE启用,c++,templates,c++17,sfinae,C++,Templates,C++17,Sfinae,我想编写一个具有两个模板参数的模板类,其中,当参数类型相同时,方法的一个实现可用,当参数类型不同时,方法的另一个实现可用 我知道我可以通过模板专门化来做到这一点: template<typename T, typename W> class MyClass { public: void myMethod() { std::cout << typeid(T).name() << " != " << typeid(W).name() <<

我想编写一个具有两个模板参数的模板类,其中,当参数类型相同时,方法的一个实现可用,当参数类型不同时,方法的另一个实现可用

我知道我可以通过模板专门化来做到这一点:

template<typename T, typename W> class MyClass {
public:
  void myMethod() { std::cout << typeid(T).name() << " != " << typeid(W).name() << std::endl; }
};
template<typename T> class MyClass<T,T> {
public:
  void myMethod() { std::cout << typeid(T).name() << " = " << typeid(T).name() << std::endl; }
};
模板类MyClass{
公众:

void myMethod(){std::cout Sfinae是可以的,但是方法实际上是一样的。它们具有相同类型的相同数量的参数。那么,你是说Sfinae不能用来做我所描述的事情吗?它的用途真的是隐藏不同但对某些类型无效的方法,而不是为d提供相同方法的不同实现吗不同的类型?如果这是解决这个问题的正确方法,我很乐意坚持我的模板专门化problem@user1488777-SFINAE可以使用,只是有些细微差别。请参考重复问题以了解解决方法和解释。Fwiw,因为您已经在使用C++17,所以在
myMethod如果constexpr(std:is_same_v){/*…*/}或者{/*…*/}
,只需使用
即可。
template<typename T, typename W> class MyClass {
public:
    template<typename T_ = T, typename W_ = W,
            typename = std::enable_if_t<std::is_same_v<T_,W_>>> void myMethod() {
                std::cout << typeid(T_).name() << " = " << typeid(W_).name() << std::endl;
            }

    template<typename T_ = T, typename W_ = W,
            typename = std::enable_if_t<!std::is_same_v<T_,W_>>> void myMethod() {
                std::cout << typeid(T_).name() << " != " << typeid(W_).name() << std::endl;
            }
};