🛝
名前空間とのうまい付き合い方
たまに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つだけ使いたい時にお勧めです。
Discussion