我想使用 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;
仍然找不到它的重载运算符,需要帮助,出了什么问题?
您不需要在此处使用
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
您的
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 {};
}