代码之家  ›  专栏  ›  技术社区  ›  uray

使用std::enable_if<>避免模板化二进制运算符重载不明确

  •  -2
  • uray  · 技术社区  · 2 年前

    我想使用std::enable_if<>避免环境过载 operator*(T,U) (或重新定义)来自 MyClass*otherT vs otherT*MyClass vs MyClassT*MyClassT

    比方说 MyClass 声明为:

    template <typename T> class MyClassT { ... }
    

    然后在全球范围内:

    template <typename T, typename U>
    MyClassT<T> operator*(const MyClassT<T>& t, const MyClassT<U>& u)
    {
        //...
    }
    
    template <typename T, typename U, std::enable_if_t<!std::is_same_v<MyClassT<T>, U>,bool> = true >
    MyClassT<T> operator*(const MyClassT<T>& t, const U& u)
    {
        //...
    }
    
    template <typename T, typename U, std::enable_if_t<!std::is_same_v<MyClassT<U>, T>,bool> = true >
    MyClassT<U> operator*(const T& t, const MyClassT<U>& u)
    {
        //...
    }
    

    但是的代码

    MyClassT<double> a;
    double b;
    MyClassT<double> c = a * b; 
    

    还是找不到过载的操作员,需要帮助怎么了?

    1 回复  |  直到 2 年前
        1
  •  1
  •   user12002570    2 年前

    你不需要使用 enable_if 和默认参数,如下所示。

    template <typename T, typename U >
    MyClassT<T> operator*(const MyClassT<T>& t, const U& u)
    {
        //...
        return {};
    }
    
    template <typename T, typename U >
    MyClassT<U> operator*(const T& t, const MyClassT<U>& u)
    {
        //...
        return {};
    } 
    MyClassT<double> a;
    double b;
    MyClassT<double> c = a * b;  //works now
    MyClassT<double> k = b * a; //works  
    

    Working demo