使用 std::enable_if<> 来避免模棱两可的模板化二元运算符重载

问题描述 投票:0回答:2

我想使用 std::enable_if<> 来避免

operator*(T,U)
vs
MyClass*otherT
vs
otherT*MyClass
 的不明确重载 
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; 

仍然找不到它的重载运算符,需要帮助,出了什么问题?

c++ c++17 operator-overloading enable-if is-same
2个回答
0
投票

您不需要在此处使用

enable_if
和默认参数,如下所示。目前没有任何重载可以匹配
a*b

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  

工作演示


0
投票

您的

operator*
的 3 个重载都无法匹配
MyClassT<double>
*
double

如果你想支持

MyClassT<T>
乘以
T
(对于某些类型T,例如
double
),你需要添加:

template <typename T>
MyClassT<T> operator*([[maybe_unused]] const MyClassT<T>& t, [[maybe_unused]] const T& t2)
{
    // ...
    return {};
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.