簡體   English   中英

運算符在模板類外部重載,具有隱式轉換

[英]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
}

別人會闡明這更好的,但我認為問題是,編譯器不能推斷TWrap<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM