2017-02-21 27 views
1

関数と代理人を渡すときに、正しくオーバーロードされたテンプレートを選択するときに問題が発生しているようです。 は、この例を見てみましょう:関数/デリゲートがオーバーロードされたテンプレートと一致しません

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)から呼び出すことなく、強制的に正しい選択を行う方法はありますか? template specialization docsから

答えて

0

正確にテンプレートのインスタンスに一致するシーケンスパラメータなしのシーケンスパラメータとテンプレートとテンプレートの両方場合は、TemplateSequenceParameterなしのテンプレートが選択されています。

あなたはisSomeFunctionに制約を加えることによってそれを回避することができます。

void test(T)(T a) if (!isSomeFunction!T) { 
    assert(0); 
} 
関連する問題