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