簡體   English   中英

非原始盒裝類型的運算符

[英]Operators for non-primitive boxed types

我有以下類定義:

template <typename T>
class MyBox {
public:
    MyBox(T value) { _value = value; }
    operator T() const { return _value;  }
private:
    T _value;
};

typedef MyBox<int> MyInt;
typedef MyBox<std::string> MyString;

當我嘗試在我的typedef上使用運算符時

bool first = MyInt(1) == MyInt(1);    // works
bool second = std::string(MyString("a")) == std::string(MyString("a"));    //works
bool third = MyString("a") == MyString("a");   // does not compile

編譯器抱怨第三次比較

沒有運算符“==”匹配這些操作數。 操作數類型是:MyString == MyString

這種情況發生在任何其他非原始拳擊(例如MyBox<float>工作,但MyBox<std::map<int,int> > >>> not。為什么會這樣?

這對我來說尤其不清楚,因為對於第一次和第二次比較,使用了operator T() - 為什么不能自動為MyString完成?

更新:除了為每個非原始模板提供特定的運算符之外,還有一個簡單的解決方案嗎? 如何處理MyString("a") == std::string("a")

以下SO問題解答了為什么它適用於內置類型但不適用於自定義類型的原因: 在比較中使用具有隱式轉換的用戶定義轉換 簡而言之,這是因為模板推導類型不會發生類型轉換。 雖然內置operator== for int不是模板(因此可以在使用MyBox<int>時使用類型轉換找到),但operator==對於std::string是一個模板。

但是,上面提到的問題沒有詳細說明如何解決這個問題。 方法如下:添加以下免費功能

template<class T>
bool operator==(const MyBox<T>& lhs, const MyBox<T>& rhs) {
    return static_cast<const T&>(lhs) == static_cast<const T&>(rhs);
}

template<class T>
bool operator==(const MyBox<T>& lhs, const T& rhs) {
    return static_cast<const T&>(lhs) == rhs;
}

template<class T>
bool operator==(const T& lhs, const MyBox<T>& rhs) {
    return lhs == static_cast<const T&>(rhs);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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