2009-07-31 15 views

答えて

149

名前空間エイリアスは、長い名前空間名を別の短い名前で参照する便利な方法です。

例として、using namespace指示文のないブーストのuBLASからの数値ベクトルを使いたいとします。完全な名前空間を述べるたびに面倒です: - 代わり

boost::numeric::ublas::vector<double> v; 

、あなたがboost::numeric::ublasの別名を定義することができますが、我々はちょうどublasにこれを省略したいと言う:

namespace ublas = boost::numeric::ublas; 


ublas::vector<double> v; 
+7

おそらくdownvotesを説明するために、SOは良いC++教科書の代わりになることはありません。あなたが提起した質問には、そのような本が答えてくれます。そして、あなた自身の質問に答えるためのSOの "特徴"は、そのような本の言い換えを提供するために使用すべきではありません。 –

+16

違反していない...ちょうど私がこれをした理由を説明するだけです。ポッドキャストでのJoelのコメントから、「初心者レベル」の質問でさえSOの公正ゲームであり、質問と回答そのコンテンツがまだアクセス可能な形式ではない場合は、それ自身でしかし、明らかに、これは怒られていますか? –

+1

刺激を避けるために、あなた自身の質問に答えるための確かな礼儀があります。このケースでは、それが決して**実際の質問ではなかったことはかなり明らかです。たとえば、http://stackoverflow.com/questions/494927/stack-overflow-etiquette-for-answering-your-own-question –

6

を簡単に言えば、の#define動作しません。

namespace Mine { class MyClass { public: int i; }; } 
namespace His = Mine; 
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; } 

コンパイルは正常です。名前空間/クラス名の衝突を回避できます。

namespace Nope { class Oops { public: int j; }; } 
#define Hmm Nope 
namespace Drat { class Nope: public Hmm::Oops { void f() { j = 1; } }; } 

「Hmm:Oops」はコンパイルエラーです。プリプロセッサはそれをNope :: Oopsに変更しますが、Nopeはすでにクラス名です。

+0

だからシンプルだが同時に面倒だ...;) – Hermes

+2

何#define?おそらくあなたの答えは質問の前のバージョンを指しているでしょうか? – einpoklum

1

それはすべてのような、looongネームスペース名のエイリアスの選択についてですhttp://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

このトピックに関する追加情報:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

その後、あなたは

typedef SHORT::mytype

をtypedefをすることができます

の代わりに

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

この構文は、クラスのみを含めることはできません、namespace NAME =

1

後のタイプも、その名前空間のエイリアスを注意してディレクティブを使用して、時間を実行しないで、コンパイル時に解決され、名前空間のために働きます。 (具体的には、現在のスコープ内の特定のシンボルやその親スコープを見つけることができない場合に、名前を解決するときに他にどこを探すかをコンパイラに指示するツールです。コンパイル:

namespace A { 
    int foo; 
    namespace AA { 
     int bar; 
    } // namespace AA 
    namespace AB { 
     int bar; 
    } // namespace AB 
} // namespace A 
namespace B { 
    int foo; 
    namespace BA { 
     int bar; 
    } // namespace BA 
    namespace BB { 
     int bar; 
    } // namespace BB 
} // namespace B 

bool nsChooser1, nsChooser2; 
// ... 

// This doesn't work. 
namespace C = (nsChooser1 ? A : B); 
C::foo = 3; 

// Neither does this. 
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.) 
if (nsChooser1) 
    if (nsChooser2) 
     using namespace A::AA; 
    else 
     using namespace A::AB; 
else 
    if (nsChooser2) 
     using namespace B::BA; 
    else 
     using namespace B::BB; 

は今、好奇心心は constexpr変数もコンパイル時に使用されていることに気づいた、と彼らはエイリアスまたはディレクティブのいずれかと組み合わせて使用​​することができるかどうかを疑問に思う可能性があります。私の知る限りでは、私はこれについて間違っているかもしれませんが、できません。異なる名前空間で同じ名前の変数を扱い、それらの間を動的に選択する必要がある場合は、参照またはポインタを使用する必要があります。

// Using the above namespaces... 
int& foo = (nsChooser1 ? A::foo : B::foo); 

int* bar; 
if (nsChooser1) { 
    if (nsChooser2) { 
     bar = &A::AA::bar; 
    } else { 
     bar = &A::AB::bar; 
    } 
} else { 
    if (nsChooser2) { 
     bar = &B::BA::bar; 
    } else { 
     bar = &B::BB::bar; 
    } 
} 

上記の有用性は限定されていてもよいが、その目的に役立つはずである。

(私が上記で忘れたかもしれないタイプの入力については、私のお詫び申し上げます。)

関連する問題