绑定模板的实例化器函数无法编译

时间:2013-07-06 11:51:49

标签: templates d dmd range-checking

我正在尝试为我的Bound模板包装器实现一个实例化器函数,但我无法让它工作。我需要这个,以说服工作中的人们,我们应该从Ada切换 到D。

我想要这个模板

/** Bounded Value of Type T. */
struct Bound(T,
             T min = T.min,
             T max = T.max,
             bool Exceptional = true) {
...
}

将被实例化为

auto x = bound!(0.0, 10.0)(1.0);

这就是我希望第一个模板参数T由模板参数minmax的值推断出来。但是如何使用默认值指定模板参数?

当然我总能做到

auto bound(float min, float max, bool Exceptional = true)(float value) {
    return Bound!(float, min, max, Exceptional)(value);
}

但如何将bound设为模板?

1 个答案:

答案 0 :(得分:1)

一点点的解决方法,但这可行:

import std.traits;

template bound(alias min, alias max, bool Exceptional = true)
    if (!is(CommonType!(typeof(min), typeof(max)) == void))
{
    auto bound(CommonType!(typeof(min), typeof(max)) value) {
        return Bound!(typeof(value), min, max, Exceptional)(value);
    }
}

它的工作原理如下:

void main()
{
    auto a = bound!(0.0f, 2.0f)(1.0f);  
    auto b = bound!(0, 2)(1);

    import std.stdio;
    writeln(typeof(a).stringof); // Bound!(float, 0.00000F, 2.00000F, true)
    writeln(typeof(b).stringof); // Bound!(int, 0, 2, true)
}