2017-02-21 21 views
1

Похоже, что у 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).

  1. Почему именно (T a) выбранный матч?
  2. Есть ли способ принудительного выбора, не передавая параметры явно, и не вызывая (Ret function(Args)) с точностью до (T a)?

ответ

0

От template specialization docs:

Если оба шаблона с параметром последовательности и шаблон без параметров последовательности точно соответствуют шаблону экземпляра, выбран шаблон без TemplateSequenceParameter.

Вы можете работать вокруг него, добавив ограничение с isSomeFunction:

void test(T)(T a) if (!isSomeFunction!T) { 
    assert(0); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^