[英]Operator overloading outside a template class with implicit conversions
我有一個像這樣定義的模板類
template<class T> class Wrap
{
/* ... */
public:
Wrap(const T&);
/* other implicit conversions */
/* ... */
};
我想在類之外為這個類定義所有比較運算符
template<typename T> bool operator == (const Wrap<T>&, const Wrap<T>&)
{
// Do comparison here
}
但是,此聲明不支持將const T&
或任何其他類型的隱式轉換為const Wrap<T>&
。
所以我的問題是當其中一個操作數是Wrap<T>
而另一個不是時,我如何使它支持隱式轉換。 我不想為每個可能的排列編寫每個運算符的多個聲明。
template<class T> struct is_wrap : std::false_type {};
template<class T> struct is_wrap<Wrap<T>> : std::true_type {};
template<class T1, class T2> typename std::enable_if<is_wrap<typename std::common_type<T1, T2>::type>::value, bool>::type operator == (const T1& t1, const T2& t2)
{
const typename std::common_type<T1, T2>::type& tc1 = t1, tc2 = t2;
// compare with tc1 and tc2
}
別人會闡明這更好的,但我認為問題是,編譯器不能推斷T
在Wrap<T>
沒有你傳遞一個Wrap
對象。 我認為如果你明確地給operator==
一個模板參數,你的情況應該得到解決: operator==<int>(7, 4)
,例如應該工作。
我面前沒有編譯器,但這是我的嘗試:
template<typename T>
typename std::enable_if<std::is_convertible<Wrap<T>, T>::value, bool>::type operator==(const Wrap<T>& l, const T& r)
{
return l.stuff == Wrap<T>(r).stuff;
}
template<typename T>
typename std::enable_if<std::is_convertible<Wrap<T>, T>::value, bool>::type operator==(const T& l, const Wrap<T>& r)
{
return r == l; // call above operator
}
如果任何一方是Wrap
而另一方不是,那么這應該有效。 您也可以將兩個邊作為const T&
,但是如果Wrap
實際上可以從任何T
隱式構造,那么您將最終使用operator==
進行許多非預期的比較,甚至是int
s, string
s等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.