2013-04-17 111 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