是否有可能专注于可变参数同名模板?

时间:2016-02-27 21:54:03

标签: d

我想扩展min,以便它也适用于我的矢量类型。

例如,对于两个向量,min应该返回一个由两个向量的最低值组成的新向量。

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模板时,它将调用正确的最小模板?

1 个答案:

答案 0 :(得分:3)

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行为相差甚远(而不是返回其中一个元素,它会返回其中的一些组合),这可能只是让它变得不同名。