首页 > 解决方案 > SFINAE enable_if 与 is_same 用法

问题描述

我想写一个带有两个模板参数的模板类,当参数类型相同时,一个方法的实现可用,而当类型不同时,一个不同的实现可用。

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

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; }
};

但我试图在 SFINAE 范式上做得更好,所以试着写这样的东西:

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;
            }
};

但是编译器说这是对方法的重新声明。

有人可以在这里纠正我对 SFINAE 的使用吗?

谢谢!

标签: c++templatesc++17sfinae

解决方案


推荐阅读