2011-02-03 20 views
3

我儘量避免在我的C++中使用「命名空間」來避免污染我的命名空間。但是,我想利用助推賦值操作符來做這樣的事情:有沒有辦法使用boost :: assign操作符而不會污染命名空間?

 
std::vector tmp; 
tmp += "abc","def","asdf","foo","blah","dfkef"; 

不添加「using namespace boost :: assign;」這將產生一個錯誤:

 
error: no match for 'operator+=' in 'tmp += "abc"' 

有沒有一種方法,使利用升壓這些運營商不使用命名空間?

回答

13

您錯誤地認爲它會污染命名空間:using namespace功能正是爲這種用途創建的。

它只會「污染」using namespace的聲明範圍,在這種情況下,使用操作員的好處遠遠大於缺點(這種「污染」與微粒的大小可以忽略不計範圍)。

例如,你可以有:

void foo() 
{ 
    // no symbol of boost::assign is polluting here 

    std::vector tmp; 

    { 
     using namespace boost::assign ; 
     // brings in this scope all the symbols of boost::assign 
     tmp += "abc","def","asdf","foo","blah","dfkef"; 
    } 

    // no symbol of boost::assign is polluting here 
} 

你應該決定由using namespace帶來的語法糖和潛在的污染也可能帶來超過之間的平衡。

一個很好的妥協可能是將其限制在一個函數體,或者,如果你是偏執的我,創造一個範圍只爲這using聲明...

作爲一個有趣側面說明,最糟糕的解決方案是將該使用放在帶有導出符號的公共標題中。

+0

我想如果你的函數足夠大,你可以引入`using`語句的作用域,你的函數應該被分割或者你的標準太嚴格了,而using語句對函數的其他部分沒有影響。引入範圍是沒有意義的。 – GManNickG 2011-02-03 23:24:35

相關問題