1. ホーム
  2. c++

[解決済み] C++でネストした名前空間をヘッダで表現する良い方法はありますか?

2022-09-08 13:03:51

質問

私は 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