2013-04-17 4 views
2
T maybe(alias nullCheck, T)(T expr, T def) 
{ 
    if (nullCheck(expr)) 
    { 
     return def; 
    } 
    else 
    { 
     return expr; 
    } 
} 

auto tokens = chomp(readln()) 
       .toLower() 
       .split() 
       .maybe!(a => a.empty)([""]) 

Когда аргументы шаблона maybe расположены с первым псевдоним, компилятор правильно может вывести типы аргументов. Однако, когда аргументы шаблона переключаются так, что T приходит первым, он не может их вывести и не будет компилироваться. Почему это?Вывод типа D зависит от порядка аргументов шаблона

ответ

3

Это потому, что аргументы шаблона после всех позиционных аргументов. Если nullCheck был вторым аргументом, вам нужно будет указать T прежде чем вы сможете указать nullCheck.

Компилятор может (неофициально) попытаться вывести аргументы справа от последнего позиционного аргумента, как если бы они были аргументами по умолчанию.

Обратите внимание, что это то же самое, что и на C++, и разумно, если вы думаете об этом.

+0

tl; dr; Явным образом предоставленные аргументы (шаблон или другие) назначаются префиксу полного списка аргументов. – BCS

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

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