私は 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
アップデート
わかりました、Java/C# と C++ での使用の概念が異なると言う人もいます。本当に?名前空間の目的は (動的な) クラスのロードだけではないと思います (これは非常に技術的な理由による観点です)。読みやすさと構造化のために使用しないでください。たとえば、「IntelliSense」を考えてみてください。
現在、名前空間とそこにあるものとの間にロジック/接着剤はありません。Java と C# はこれをはるかに優れた方法で行います...<iostream>
名前空間を含めて持つのはなぜstd
ですか? わかりました。ロジックがインクルードするヘッダーに依存する必要があると言うなら、なぜ #include は or のような「IntelliSense」に適した構文を使用しないのです#include <std::io::stream>
か<std/io/stream>
? デフォルトのライブラリに構造化が欠けていることは、Java/C# と比較した C++ の弱点の 1 つだと思います。
熾烈な衝突への独自性を1つのポイント(C#やJavaのポイントでもあります)なら、プロジェクト名や会社名を名前空間として使うのもいいアイデアだと思いませんか?
一方で、C++ が最も柔軟であると言われています... しかし、誰もが「これを行うな」と言いましたか? C++ は多くのことを実行できるように思えますが、多くの場合、C# と比較して最も簡単なことに対してさえ構文がひどいものです。
更新 2
ほとんどのユーザーは、2 つのレベルよりも深いネストを作成するのはナンセンスだと言います。では、Win8 開発における Windows::UI::Xaml および Windows::UI::Xaml::Controls::Primitives 名前空間はどうでしょうか。Microsoft の名前空間の使用法は理にかなっていると思います。実際、それは単なる 2 レベルよりも深いものです。より大きなライブラリ/プロジェクトには、より深いネストが必要だと思います (ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace のようなクラス名は嫌いです... そうすれば、すべてをグローバル名前空間にも入れることができます)。
更新 3 - まとめ
ほとんどの人は「やらない」と言いますが...ブーストでさえ、1つまたは2つのレベルよりも深いネストがあります。はい、それはライブラリですが、再利用可能なコードが必要な場合は、独自のコードを他の誰かに提供するライブラリのように扱ってください。また、名前空間を使用して発見目的でより深いネストを使用します。