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

【D言語】std.traits.Unqualについて【Phobos】

前回の記事に書いた通り、const(const(int))みたいなのは全部

  • const(int)
  • immutable(int)
  • shared(int)
  • shared(const(int))

のどれかに収まります。 で、現状のstd.traits.Unqualは


template Unqual(T)
{
    version (none) // Error: recursive alias declaration @@@BUG1308@@@
    {
             static if (is(T U ==     const U)) alias Unqual!U Unqual;
        else static if (is(T U == immutable U)) alias Unqual!U Unqual;
        else static if (is(T U ==     inout U)) alias Unqual!U Unqual;
        else static if (is(T U ==    shared U)) alias Unqual!U Unqual;
        else                                    alias        T Unqual;
    }
    else // workaround
    {
             static if (is(T U == shared(const U))) alias U Unqual;
        else static if (is(T U ==        const U )) alias U Unqual;
        else static if (is(T U ==    immutable U )) alias U Unqual;
        else static if (is(T U ==        inout U )) alias U Unqual;
        else static if (is(T U ==       shared U )) alias U Unqual;
        else                                        alias T Unqual;
    }
}

となってます。 率直に言うと、dmd v2.061でversion(none)内のコードは動きます。 動きますが、無駄な再帰的aliasになります。 前回の記事にもある通り、下のWorkaroundのコードで十分です。

そんなわけで、std.traits.Unqualは、


template Unqual(T)
{
         static if (is(T U == shared(const U))) alias U Unqual;
    else static if (is(T U ==        const U )) alias U Unqual;
    else static if (is(T U ==    immutable U )) alias U Unqual;
    else static if (is(T U ==        inout U )) alias U Unqual;
    else static if (is(T U ==       shared U )) alias U Unqual;
    else                                        alias T Unqual;
}

となってるといいですね。

担当:美馬(Pull Requestを投げてみるか?)