2011-08-24 6 views
5

私は1つに複数の名前空間を結合する方法上のどこかのノートを見て思い出しているようです。でも、私は何を考え出すていないよ、コーミング検索用語を使用して検索をグループ化し、合併やラッピング -個別のネームスペースをラップまたはマージすることは可能ですか?

は今、を探しているノートは、私はそれらを見つけるわけではないと述べました。多分私は以前見たことを誤解したかもしれません。 私はこれのための特定のアプリケーションを持っていない、それはちょうど好奇心であり、少し考案されています。

はしかし、私はどちらか単に構文を探して別の名前でそれらをラップした2つのネームスペース...

namespace a {int func() {return 1;}} 
namespace b {int func() {return 2;}} 

で始まる - 事実の後に - (はい、私は私ができる知っていますネストされた方法でそれを書き直すか、それらを1つの新しいスペースにマージする)。しかし、私は多くの作品の名前空間の1つに追加すれば私はそれを見つけました。

namespace c {namespace a{ int func2() {return 3;}} } 


int main(int argc, char **argv) 
{ 
    int a = a::func();   // normal case 
    int c = c::a::func2();  // wrapped and added to 

    //int c = c::func2();  // doesn't work 
    //int d = a::func2();  // doesn't work 
} 

質問は以下のとおりです。

1)一つだけ新しいものに二つのスペースを組み合わせた構文がありますか?

2)部分空間に多くを追加することなく、スペースをラップする構文はありますか?

namespace c 
{ 
    using namespace a; 
    using namespace b; 
} 

をしかし、aとbが同じ名前を持つ要素を持っている場合は、名前空間cからそれらを使用することはできません。

+1

私はあなたが名前空間を使用して '置くことができると仮定し、 'B''でなく、問題を引き起こす可能性が関数名を重ねます。 – GWW

+0

これのポイントは何ですか? – Rhexis

+0

@Flyphe - 上記の質問から引用する:*私はこのために、特定のアプリケーションを持っていない、それだけで好奇心だと、それは少し不自然です* – Arbalest

答えて

6

あなたはこれを行うことができます。あなたはこのような新しいものに名前空間をラップすることができます

+0

感謝。後で見るかもしれない人のためのメモを残すために、使用法の構文は次のとおりです: 'int a = c :: func(); '名前の競合があるときのための他の答えを見てください。 – Arbalest

4

namespace c { 
    namespace a { using namespace ::a; } 
    namespace b { using namespace ::b; } 
} 
+0

これは同様に良い解決策です。これは、名前を修飾するためにもう少しタイピングのために呼び出しますが、それは良いことができ、特に場合は部分空間の競合で名前 'int型、A = C :: :: funcを();' – Arbalest

5

C++ 11以来の最高のソリューションです:あなたが修飾することができます競合しない名前の

namespace c 
{ 
    inline namespace a { using namespace ::a; } 
    inline namespace b { using namespace ::b; } 
} 

この方法のみcによると、あなたはc::ac::bをqualifingことにより、競合を解決することができます。

例えば:

namespace a 
{ 
    auto foo_a() { cout << "a::foo_a" << endl; } 
    auto foo() { cout << "a::foo" << endl; } 
} 
namespace b 
{ 
    auto foo_b() { cout << "b::foo_b" << endl; } 
    auto foo() { cout << "b::foo" << endl; } 
} 

namespace c 
{ 
    inline namespace a { using namespace ::a; } 
    inline namespace b { using namespace ::b; } 
} 

int main() 
{ 
    c::foo_a(); 
    c::foo_b(); 

    c::a::foo(); 
    c::b::foo(); 

    return 0; 
} 
関連する問題