C++の「名前空間エイリアス」とは何ですか?どのように使用されていますか?C++では、「名前空間エイリアス」とは何ですか?
答えて
名前空間エイリアスは、長い名前空間名を別の短い名前で参照する便利な方法です。
例として、using namespace
指示文のないブーストのuBLASからの数値ベクトルを使いたいとします。完全な名前空間を述べるたびに面倒です: - 代わり
boost::numeric::ublas::vector<double> v;
、あなたがboost::numeric::ublas
の別名を定義することができますが、我々はちょうどublas
にこれを省略したいと言う:
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
を簡単に言えば、の#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はすでにクラス名です。
それはすべてのような、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 NamespaceFirst::NameSpaceNested::Meow::mytype
この構文は、クラスのみを含めることはできません、namespace NAME =
後のタイプも、その名前空間のエイリアスを注意してディレクティブを使用して、時間を実行しないで、コンパイル時に解決され、名前空間のために働きます。 (具体的には、現在のスコープ内の特定のシンボルやその親スコープを見つけることができない場合に、名前を解決するときに他にどこを探すかをコンパイラに指示するツールです。コンパイル:
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;
}
}
上記の有用性は限定されていてもよいが、その目的に役立つはずである。
(私が上記で忘れたかもしれないタイプの入力については、私のお詫び申し上げます。)
- 1. C++の名前空間エイリアスの範囲は何ですか?
- 2. 名前空間でのクラス名のエイリアスはできますか?
- 3. ExtJs名前空間エイリアス
- 4. Rake名前空間エイリアス
- 5. XmlSampleGenerator名前空間は何ですか?
- 6. C++では、非名前空間、非クラス名の名前を変更/エイリアスできますか?
- 7. C++のネストされた名前空間エイリアスは可能ですか?
- 8. ASP.NET 3.5では、.Tag名前空間とは何ですか?
- 9. 名前空間、エイリアス、Visual Studioフォームデザイナー
- 10. インポートされた名前空間のエイリアス
- 11. C++での名前空間
- 12. Server.Transferメソッドの名前空間とは何ですか?
- 13. OpenCV HighGUI名前空間とは何ですか?
- 14. IServiceインターフェイスの名前空間とは何ですか?
- 15. 名前空間「標準」とは何ですか?
- 16. NUnit CollectionAssertの名前空間とは何ですか?
- 17. 名前空間エイリアス演算子::をC#で動作させるには?
- 18. ASP.NET 3.5では、ReorderListコントロールの名前空間は何ですか?
- 19. どのようにC#で名前空間にエイリアスを与えますか
- 20. C++ 11のグローバル名前空間のエイリアス方法
- 21. c#Microsoft名前空間の名前はどこで検索できますか?
- 22. 名前空間で始まる::でC++
- 23. C#でグローバル(または名前空間またはファイル)エイリアス/ヴァース/何かをハックすることはできますか?
- 24. Visual Studio C#expressのWin32_NetworkAdapterの参照名前空間は何ですか?
- 25. ビジュアルNUnitでは名前空間とフィクスチャが空です
- 26. 名前空間C#.NET
- 27. clojureから来たときにclojurescriptの名前空間は何ですか?
- 28. C#の名前空間名 "LinqToVisualTree"はありますか?
- 29. はNDBは、名前空間
- 30. C++クラスの宣言と名前空間
おそらくdownvotesを説明するために、SOは良いC++教科書の代わりになることはありません。あなたが提起した質問には、そのような本が答えてくれます。そして、あなた自身の質問に答えるためのSOの "特徴"は、そのような本の言い換えを提供するために使用すべきではありません。 –
違反していない...ちょうど私がこれをした理由を説明するだけです。ポッドキャストでのJoelのコメントから、「初心者レベル」の質問でさえSOの公正ゲームであり、質問と回答そのコンテンツがまだアクセス可能な形式ではない場合は、それ自身でしかし、明らかに、これは怒られていますか? –
刺激を避けるために、あなた自身の質問に答えるための確かな礼儀があります。このケースでは、それが決して**実際の質問ではなかったことはかなり明らかです。たとえば、http://stackoverflow.com/questions/494927/stack-overflow-etiquette-for-answering-your-own-question –