2011-12-27 24 views
2
#include <iostream> 
#include <string> 
#include "boost/operators.hpp" 

using namespace std; 

class simple_string : private boost::addable1<simple_string, 
           boost::addable2<simple_string, const char*> > 
{ 
public: 
    simple_string() : m_str("Default") 
    {} 

    explicit simple_string(const char* s) : m_str(s) 
    {} 

    simple_string(const simple_string& rhs) : m_str(rhs.m_str) 
    {} 

    simple_string operator+=(const simple_string& rhs) 
    { 
    m_str += rhs.m_str; 
    return *this; 
    } 

    simple_string operator+=(const char* rhs) 
    { 
    this->operator+=(simple_string(rhs)); 
    return *this; 
    } 

    friend ostream& operator<<(ostream& os, const simple_string& si) 
    { 
    os << si.m_str; 
    return os; 
    } 

private: 
    string m_str; 
}; 

int main(void) 
{ 
    simple_string s1; 
    simple_string s2(s1); 
    cout << "[before] s2: " << s2 << endl; 

    s2 += s1; 
    cout << "s2 += s1: " << s2 << endl; 

    simple_string s3 = s1 + s2; 
    cout << "s3: " << s3 << endl; 

    simple_string s4 = s3 + "Why"; 
    simple_string s5 = "Now" + s3; 
    cout << "s4: " << s4 << endl; 
    cout << "s5: " << s5 << endl; 
    cout << "Now" + simple_string() << endl; 
    return 0; 
} 

輸出用法 - 爲什麼從運營商+返回的結果是相反的

~/Documents/C++/boost $ g++ -o p123 p123.cpp 
~/Documents/C++/boost $ ./p123 
[before] s2: Default 
s2 += s1: DefaultDefault 
s3: DefaultDefaultDefault 
s4: DefaultDefaultDefaultWhy 
s5: DefaultDefaultDefaultNow 
DefaultNow 
~/Documents/C++/boost $ 

問題>爲什麼產生operator+(const char*, const simple_string&)不不返回正確的結果?

例如,對於s5預期的結果應該是s5: NowDefaultDefaultDefault

"Now" + simple_string()的結果應該是NowDefault

回答

1

的問題是,對於字符串operator+是不可交換的,但升壓實現假定它是。詳細信息請參見http://www.boost.org/doc/libs/1_32_0/libs/utility/operators.htm#symmetry的對稱說明。

編輯:在閱讀實際的提升代碼時,我想我錯了。對於其中operator+不可交換的類,您不能使用boost操作符生成,因爲這是boost中的隱式假設。你必須自己實現它。

基礎上(我相信)原始答案不正確讀取文檔:

您可以強制可能較有效率的代碼不承擔對稱如下所示:

...if your code relies on the function signature or a strict symmetric behaviour, you should set BOOST_FORCE_SYMMETRIC_OPERATORS in your user-config. This will force the NRVO-friendly implementation to be used even for compilers that don't implement the NRVO.

+0

這是我的意見在閱讀文檔並同意你的回答後,簡單地實現你想要的這些非交換案例的操作員會更容易和更清楚,儘管這並沒有真正回答這個問題。 – lefticus