【D言語】std.traits.Unqualについて【Phobos】
前回の記事に書いた通り、const(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を投げてみるか?)