Похоже, что у D есть проблемы с выбором перегруженного шаблона при передаче функций и делегированию им. Возьмем такой пример:функции/делегаты, не соответствующие перегруженному шаблону
import std.stdio;
void test()(string a){
writeln(a);
}
void test(Ret, Args...)(Ret function(Args) fn){
writeln(fn(1, 2));
}
void test(T)(T a){
assert(0);
}
void main(){
test("something");
test((int a, double b){
return "works";
});
}
Теоретически, это должно печатать something\nworks
. Но это выход:
something
[email protected](15): Assertion failure
...
Он работает при удалении void test(T)(T a)
.
- Почему именно
(T a)
выбранный матч? - Есть ли способ принудительного выбора, не передавая параметры явно, и не вызывая
(Ret function(Args))
с точностью до(T a)
?