[解決済み] C++でネストした名前空間をヘッダで表現する良い方法はありますか?
質問
私は C++ から Java と C# に切り替え、名前空間/パッケージの使用はそこでははるかに優れていると思います (よく構造化されています)。その後、C++ に戻り、同じ方法で名前空間を使用しようとしましたが、必要な構文はヘッダー ファイル内でひどいものでした。
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
以下もおかしいと思います(深いインデントを避けるため)。
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
{
上記のことをもっと短く表現する方法はないのでしょうか?私は、以下のようなものを見逃しています。
namespace MyCompany::MyModule::MyModulePart::...
{
public class MyClass
更新
OK、Java/C#とC++では使い方の概念が違うという人もいます。そうなんですか?私は、(動的な) クラス読み込みだけが名前空間の目的ではないと思います (これは非常に技術的な理由による視点です)。読みやすさや構造化のために使ってはいけないのでしょうか?例えば、quot;IntelliSense"を考えてみてください。
現在、名前空間とそこで見つけられるものの間に論理/接着剤はありません。Java と C# はこれをはるかにうまく行っています... なぜ
<iostream>
を含み、名前空間
std
?
OK、もしあなたがロジックがインクルードするヘッダーに頼るべきだと言うなら、なぜ#includeは"IntelliSense"のようなフレンドリーな構文を使用しないのでしょう?
#include <std::io::stream>
または
<std/io/stream>
? デフォルトのライブラリに構造化がないのは、Java/C#に比べたC++の弱点の一つだと思います。
競合を回避するための一意性を一つのポイントとするならば(これはC#やJavaのポイントでもある)、プロジェクト名や会社名を名前空間とするのは良いアイデアだと思いますが、いかがでしょう?
C++が一番柔軟性があると言われていますが、みんな「これはやめとけ」って言ってますよね? C++はいろいろなことができるけど、C#に比べると簡単なことでも多くの場合ひどい構文になっているような気がします。
アップデート 2
ほとんどのユーザーは、2 つの Level より深いネストを作成することはナンセンスであると言います。それでは、Win8 開発における Windows::UI::Xaml および Windows::UI::Xaml::Controls::Primitives 名前空間についてはどうでしょうか。Microsoftの名前空間の使い方は理にかなっていると思いますし、2つのLevel以上に奥が深いです。 大きなライブラリやプロジェクトでは、より深いネストが必要だと思います(ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpaceのようなクラス名は嫌いです... それなら、すべてをグローバル名前空間に置くこともできますね)。
アップデート3 - 結論
多くの人が「やめとけ」と言いますが、boostだって1~2階層より深いネストを持っています。確かにライブラリではありますが。もし再利用可能なコードが欲しいなら、自分のコードを他の人に渡すライブラリのように扱ってください。私は、名前空間を使った発見のために、より深いネストを使用することもあります。
どのように解決するのか?
C++17 では、ネストされた名前空間の定義が簡素化されるかもしれません。
namespace A::B::C {
}
は
namespace A { namespace B { namespace C {
} } }
cppreferenceのnamespaceのページの(8)を参照してください。
http://en.cppreference.com/w/cpp/language/namespace
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜリストの初期化(中括弧を使用)が他の方法より優れているのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません