如何限制可变参数模板化函数以强制其参数全部为同一类型?
我需要这个来专业化
CommonType!T either(T...)(T a) if (a.length >= 1)
{
static if (T.length == 1)
return a[0];
else
return a[0] ? a[0] : either(a[1 .. $]);
}
可以使用auto ref
作为返回类型转发左值。一路上的东西
auto ref either(T...
应该满足
unittest {
int x = 1, y = 2;
either(x, y) = 3;
assert(x == 3);
}
either
这允许通过逻辑和(未显示)转发值,every
类似于 Lisps 的and()
和or()
。
这将使那些喜欢 D 的人能够更强大地使用 D 中的功能结构。
更新
我相信我已经找到了一个可行的解决方案:
/** Returns: true if all types T are the same. */
template allSame(T...) {
static if (T.length <= 1) {
enum bool allSame = true;
} else {
enum bool allSame = is(T[0] == T[1]) && allSame!(T[1..$]);
}
}
CommonType!T either(T...)(T a) if (a.length >= 1) {
static if (T.length == 1) {
return a[0];
} else {
return a[0] ? a[0] : either(a[1 .. $]);
}
}
auto ref either(T...)(ref T a) if (a.length >= 1 && allSame!T) {
static if (T.length == 1) {
return a[0];
} else {
return a[0] ? a[0] : either(a[1 .. $]);
}
}
alias either or;
但是,两个版本的主体either
是相同的。这似乎是不必要的。混合是消除这种冗余的最佳方法吗?