是否可以专门化可变参数同名模板?
Is it possible to specialize variadic eponymous templates?
我想扩展 min 以便它也适用于我的矢量类型。
例如 min
两个向量应该 return 一个由两个向量的最低值组成的新向量。
min(Vec2(5,10), Vec2(-1, 15)) == Vec2(-1, 10)
auto min(Vec...)(in Vec v){
static import std.algorithm.comparison;
return componentMap!(std.algorithm.comparison.min)(v);
}
auto max(Vec...)(in Vec v){
static import std.algorithm.comparison;
return componentMap!(std.algorithm.comparison.max)(v);
}
看来我不能延长min
。如果两个 min
在同一范围内,那么 D 将只选择 std.algorithm.comparison.min
并且编译失败。是否可以专门化 min
模板,以便如果 D 找到仅包含向量的 min
模板,它将调用正确的最小模板?
std.algorithm.min
没有任何模板约束(至少没有
在这里很有用),因此如果它在
当前范围。但是,如果你还没有导入min
,你可以写一个包装器
像这样:
enum isVector(T) = is(T == Vec2);
auto min(T...)(T args) {
static import std.algorithm.comparison;
static if (allSatisfy!(isVector, T))
// return vector min
else
return std.algorithm.comparison.min(args);
}
奇怪的是,如果我
import std.algorithm.comparison;
但不是如果我
import std.algorithm.comparison : min;
,这可能是一个错误。
但是,我认为您的 min
与正常的 min
行为相去甚远(而不是返回其中一个元素,而是 returns 它们的某种组合),这可能是有道理的只是给它一个不同的名字。
我想扩展 min 以便它也适用于我的矢量类型。
例如 min
两个向量应该 return 一个由两个向量的最低值组成的新向量。
min(Vec2(5,10), Vec2(-1, 15)) == Vec2(-1, 10)
auto min(Vec...)(in Vec v){
static import std.algorithm.comparison;
return componentMap!(std.algorithm.comparison.min)(v);
}
auto max(Vec...)(in Vec v){
static import std.algorithm.comparison;
return componentMap!(std.algorithm.comparison.max)(v);
}
看来我不能延长min
。如果两个 min
在同一范围内,那么 D 将只选择 std.algorithm.comparison.min
并且编译失败。是否可以专门化 min
模板,以便如果 D 找到仅包含向量的 min
模板,它将调用正确的最小模板?
std.algorithm.min
没有任何模板约束(至少没有
在这里很有用),因此如果它在
当前范围。但是,如果你还没有导入min
,你可以写一个包装器
像这样:
enum isVector(T) = is(T == Vec2);
auto min(T...)(T args) {
static import std.algorithm.comparison;
static if (allSatisfy!(isVector, T))
// return vector min
else
return std.algorithm.comparison.min(args);
}
奇怪的是,如果我
import std.algorithm.comparison;
但不是如果我
import std.algorithm.comparison : min;
,这可能是一个错误。
但是,我认为您的 min
与正常的 min
行为相去甚远(而不是返回其中一个元素,而是 returns 它们的某种组合),这可能是有道理的只是给它一个不同的名字。