【D言語】名前空間を実現する
D言語を使ってると、C++の名前空間のようなものが欲しくなる時があります。 D言語に名前空間なる仕様はありませんが、それっぽいことを実現する方法はいくつかあります。
中がすべてstaticな構造体を使う
単純な方法ですね。
import std.stdio;
struct NameSpace
{
static:
int add(int lhs, int rhs)
{
return lhs + rhs;
}
int sub(int lhs, int rhs)
{
return lhs - rhs;
}
}
void main()
{
NameSpace.add(1, 1).writeln();
NameSpace.sub(2, 1).writeln();
}
この方法の欠点は、
- static:が浮いてる
- まとめてusing namespaceが出来ない(個々であればaliasで可能)
と言ったところでしょうか。
templateを使う
templateも、名前空間として利用できます。
import std.stdio;
template NameSpace()
{
int add(int lhs, int rhs)
{
return lhs + rhs;
}
int sub(int lhs, int rhs)
{
return lhs - rhs;
}
}
void main()
{
NameSpace!().add(1, 1).writeln();
NameSpace!().sub(2, 1).writeln();
}
欠点は、なんと言っても!()が必要なところでしょう。 ただ、template mixinによって、using namespaceのようなことが可能です。
import std.stdio;
template NameSpace()
{
int add(int lhs, int rhs)
{
return lhs + rhs;
}
int sub(int lhs, int rhs)
{
return lhs - rhs;
}
}
mixin NameSpace;
void main()
{
add(1, 1).writeln();
sub(2, 1).writeln();
}
template mixinを使う
名前をつけてtemplate mixinできることを利用します。
import std.stdio;
template NameSpaceImpl()
{
int add(int lhs, int rhs)
{
return lhs + rhs;
}
int sub(int lhs, int rhs)
{
return lhs - rhs;
}
}
mixin NameSpaceImpl NameSpace;
void main()
{
NameSpace.add(1, 1).writeln();
NameSpace.sub(2, 1).writeln();
}
この方法の欠点は、
- 名前空間が汚れる
- まとめてusing namespaceが出来ない
と言ったところです。 名前空間が汚れるのは、なんとも言えませんね・・・
template mixinと無名templateを組み合わせる
名前空間が汚れるなら、無名テンプレートを使えばいいじゃない って話になりそうですが、残念ながらD言語には無名テンプレートはありません。 仮に、無名テンプレートがあり、template mixinをaliasのように=で書けるのであれば、以下のようになりそうです。
import std.stdio;
mixin NameSpace = template()
{
int add(int lhs, int rhs)
{
return lhs + rhs;
}
int sub(int lhs, int rhs)
{
return lhs - rhs;
}
};
void main()
{
NameSpace.add(1, 1).writeln();
NameSpace.sub(2, 1).writeln();
}
すっきり書けてますね。
まとめ
とりあえず、中static構造体を使っておけば確実ですかね・・・
担当:美馬(無名テンプレートの有用性や如何に)