我正在尝试制作一个模板来确定参数是否是持有相同非限定类型的数组。
template sameUnqualArrays(A, B) {
enum bool sameUnqualArrays = isArray!A && isArray!B &&
is(Unqual!(ForeachType!A) == Unqual!(ForeachType!B));
}
unittest {
static assert(sameUnqualArrays!(ubyte[], immutable(ubyte[])));
static assert(!sameUnqualArrays!(ubyte[], immutable(byte[])));
static assert(!sameUnqualArrays!(ubyte[], ubyte));
}
不幸的是,最后一个断言没有通过,但给出了错误:
/usr/include/dmd/phobos/std/traits.d(6062,9):错误:无效的 foreach 聚合转换(ubyte)0u
这是一个错误吗?如何解决这个问题?有没有更简单的方法来实现这一目标?
最佳答案
嗯,看来短路评估在这里不起作用?这可能是一个错误,但解决方法很简单:
import std.traits;
template sameUnqualArrays(A, B) {
static if (isArray!A && isArray!B)
enum bool sameUnqualArrays =
is(Unqual!(ForeachType!A) == Unqual!(ForeachType!B));
else
enum bool sameUnqualArrays = false;
}
unittest {
static assert(sameUnqualArrays!(ubyte[], immutable(ubyte[])));
static assert(!sameUnqualArrays!(ubyte[], immutable(byte[])));
static assert(!sameUnqualArrays!(ubyte[], ubyte));
}
关于arrays - 确定模板参数是否是持有相同非限定类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549426/