2011-02-03 6 views
3

私の名前空間を汚染するのを避けるために、私のC++で "namespaceを使う"を避けようとしています。しかし、私はブースト代入演算子の使用は、このようなものを行うにしたいと思います:追加することなく、名前空間を汚染することなくboost :: assign演算子を使用する方法はありますか?

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

「名前空間boost ::を使用して割り当てます。」

 
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

+0

@GMan:あなたが正しいと思います。これは、「機能的なボディに限定するのが良い妥協である」とスコープを書くことが「編集的」なのである理由を書いた理由です。^^^.... – paercebal

+0

あなたはそうです。私は割り当てのヘッダーファイルを見て、定義が非常に最小限であるように見えますが、私は部分的にこの方法で名前空間を使いやすくすると思います。 –

関連する問題