Функция Instantiator для связанного шаблона не компилируется
Я пытаюсь реализовать функцию инстанциатора для моего Bound
шаблон оболочки, но я не могу заставить его работать. Мне это нужно для того, чтобы убедить людей на работе, что мы должны перейти с Ады на Д.
Я хочу этот шаблон
/** 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
выводиться по значениям параметров шаблона min
а также max
, Но как мне указать параметр шаблона со значением по умолчанию?
Конечно, я всегда мог сделать
auto bound(float min, float max, bool Exceptional = true)(float value) {
return Bound!(float, min, max, Exceptional)(value);
}
но как мне сделать bound
шаблон?
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)
}