🛝

名前空間とのうまい付き合い方

2024/11/23に公開

たまにnamespaceを沢山使うコードを扱う場合がありますよね。でも多ければ多いほど、インデントが増えて、一行のスペースがどんどん限られてきます。

namespace space
{
    namespace solver
    {
        namespace util
        {
            struct Test { int i; };
        }
    }
}

これが C++17 からは以下のように一行で定義できるようになりました!

namespace space::solver::util
{
    struct Test { int i; };
}

とするともうこの話は終わってしまいそうなのですが、もう少し、ネームスペースを利用する際の事も書きたいと思います。

実際にspace::solver::util::Testのようなネームスペースが沢山付いている定義を使う場合ですが、毎回全部を書くのは長いので書きたくない場合もあると思います。
そんなときのために、以下の3つの方法があります。

①using namespace

以下のようにネームスペースを一切書かなくてもいいようにできます。

using namespace space::solver::util;

Test test;

でもこれだとそもそもネームスペースを使う意味がなくなりますし、名前衝突問題にも繋がりかねないため、あんまりお勧めできないです。
これについては詳しく書くと長くなるため、また別の記事にしようと思います。

②namespace alias

以下のようにspace::solver::utilにエイリアスを付けることができます。

namespace s_s_util = space::solver::util;
s_s_util::Test test;

こちらはエイリアスが被っていない限り、名前衝突問題にはならないです。特定のネームスペースの定義を複数回使いたい時はお勧めです。

③typedef/using alias

以下のように特定のネームスペースの中の定義の方にエイリアスを付けることで、もっと短い名前で使えるようになります。

using UtilTest = space::solver::util::Test;
UtilTest test;

こちらもエイリアスが被っていない限り、名前衝突に心配はないです。特定のネームスペースの定義を1つだけ使いたい時にお勧めです。


|cpp記事一覧へのリンク|

Discussion