読者です 読者をやめる 読者になる 読者になる

【D言語】名前空間を実現する

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構造体を使っておけば確実ですかね・・・

担当:美馬(無名テンプレートの有用性や如何に)