2015-02-06 26 views
1

升壓::變體定義了operator <如下:如何改變升壓的行爲::變體操作者<

如果其中()== rhs.which()然後:content_this < content_rhs,其中 content_this是* this的內容,content_rhs是 rhs的內容。否則:哪個()< rhs.which()。

這不是我想要的,因爲我想對比一下<。舉例來說,如果我有這樣的一個變體:

typedef boost::variant<int, double, std::string> DataType; 

我想要的數據類型(1)<數據類型(2.0)接替,但數據類型(1)<數據類型( 「2」)拋出異常。有什麼辦法可以做到這一點?

我不能定義

bool operator < (const Field& lhs, const Field& rhs) 

,因爲它會與變異類中定義成員運算符<衝突。

我可以定義一個static_visitor,但我想知道是否有反正超負荷運營商<。

+1

無論你使用什麼,比較那些應該有一個可選的自定義比較。 – chris 2015-02-06 17:56:11

+1

不幸的是'variant :: operator <'是一個成員函數。 – sbabbi 2015-02-06 18:53:56

回答

1

雖然包裝您的DataType另一個結構裏面肯定是最好的解決方案,請記住,如果你需要一個快速和骯髒的修復工作的:

namespace boost 
{ 
template<> 
bool DataType::operator<(const DataType &) const 
{ 
    // impl 
} 
} 

在C++ 11你應該能夠避免namespace boost

請注意,除非您的TU在實際使用前看到此專業化,否則這將破壞ODR。

+0

謝謝,這對我有用。不過,我確實需要使用gcc 4.8進行命名空間提升 – swang 2015-02-09 23:35:41

1

創建一個包含什麼structboost::variant<Ts...> v;。將您的構造函數轉發給它(可能需要手動)。可選地提供operator boost::variant<Ts...>()

聽聽您對這個struct自己<

但是請注意,這boost::variant旨在規範工會。它應該是正常有些variant是一種類型,有些是另一種類型。

<通常是std::map型容器或排序時。讓鍵被強制爲所有相同的類型,或者排序的元素都是相同的類型,似乎是一個壞主意。如果variant不包含這兩種類型,則variant不應包含這兩種類型。

其中<自動使用的所有的地方往往希望一個可選的排序謂詞對象。我個人不能想到爲什麼我會使用異常拋出謂詞對象手動,這讓我不知道你的默認值。