Templates 绑定模板的实例化器函数不';不编译

Templates 绑定模板的实例化器函数不';不编译,templates,d,dmd,range-checking,Templates,D,Dmd,Range Checking,我正在尝试为绑定的模板包装器实现实例化器函数,但无法使其工作。我需要这个来说服工作中的人们,我们应该从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.

我正在尝试为绑定的模板包装器实现实例化器函数,但无法使其工作。我需要这个来说服工作中的人们,我们应该从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);
也就是说,我希望通过模板参数
min
max
的值来推断第一个模板参数
T
。但是如何使用默认值指定模板参数

当然,我可以一直这样做

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

但是我如何使
绑定
成为一个模板?

有一点变通方法,但这会起作用:

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)
}

有一点变通办法,但这会奏效:

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)
}

那么,这个问题解决了吗?如果是这样,你可以把你的解决方案作为答案。如果没有,你能把你的问题说得更清楚些吗?是的,请这样做。将许多已解决的问题标记为未回答的问题,搜索结果会降低问题快速得到回答的可能性。更新问题。抱歉耽搁了。那么,这个问题解决了吗?如果是这样,你可以把你的解决方案作为答案。如果没有,你能把你的问题说得更清楚些吗?是的,请这样做。将许多已解决的问题标记为未回答的问题,搜索结果会降低问题快速得到回答的可能性。更新问题。抱歉耽搁了。啊哈<代码>别名
是关键。美好的再次谢谢彼得。啊哈<代码>别名
是关键。美好的再次谢谢你,彼得。