2012-12-07 7 views
12

私は速記で​​Dテンプレートのすべての彼の例を書いた教授を持っています。誰かがそれを説明することができますか?誰かがD言語のテンプレート短縮形を説明できますか?</p> <pre><code>T exec(alias f,T)(T t) { return f(t); } </code></pre> <p>私はこれが何を意味するのかを説明任意の例を見つけることができません:

+12

ダンは、あなたがDに書い教授を持っています!コール! – Mehrdad

+1

はい、彼は入門コースとしてDの教授法を唱えてくれた長い論文を書いています(今はC#を最初に教えています)。 – David

+0

私は今のところそれが好きですが、構文に慣れるのはちょっと難しいです。 – David

答えて

15

関数テンプレートでは、最初の括弧のセットはテンプレート引数を保持し、2番目のセットは関数の引数を保持します。

http://dlang.org/template.html#function-templates

あなたはようことを書き換えることができます:テンプレートメンバーはテンプレート自体と同じ名前を持つ場合

template exec(alias f, T) { 
    T exec(T t) { 
     return f(t); 
    } 
} 

の利用時点で、あなたはそれを2回記述する必要はありません。これは、シノミクストリックと呼ばれています。 http://www.bing.com/search?q=eponymous+trick+d+programming+language&qs=n&form=QBRE&pq=eponymous+trick+d+programming+languag&sc=0-0&sp=-1&sk=

私が見てきたほとんどのDコードは短い形式を使用していますが、長いテンプレート構文は関数、クラス、または構造体ではまれです。struct Foo(T){}は構造体テンプレートです

このexecテンプレートの引数そのものは、関数名や変数名や "T"などの一般的な型など、渡すことを決めたシンボルである "エイリアスf"です。繰り返されるTは、その型への参照です。

利用ポイントで、あなたが最も可能性が高い。このようにそれが表示されます:

int foo(int a) { return a; } // just a regular function 
exec!(foo)(10); // instantiates the template with arguments (foo, int), and then calls the function. 

ここでは、関数の引数によって暗黙的に考え出している2番目のテンプレート引数。これは関数テンプレートでよく見られます。多くのテンプレート引数は暗黙的なものなので、書かれていることはめったにありません。これは、Dの議論で「暗黙の関数テンプレートのインスタンス化」を意味する「IFTI」として参照されることがあります。

+1

ありがとう!それは助けて! – David

+3

Dテンプレートの詳細については、http://ddili.org/ders/d.en/templates.html https://github.com/PhilippeSigaud/D-templates-tutorial/blob/master/dtemplatesを参照してください。 pdf – jpf

3
T exec(alias f,T)(T t) { 
    return f(t); 
} 

ここに簡略化されたテンプレート機能があります。それを書くために«通常の方法»は、次のとおりです。D

template exec(alias f, T) { 
    T exec(T t) { 
     return f(t); 
    } 
} 

、テンプレートのスコープ内のシンボルは、同じ名前を持つ場合、テンプレート自体が持っている、あなたは(それはみかんのエイリアスです)テンプレートとして使用することができます。

次に、aliasテンプレートパラメータは、何でもよいことを意味します。シンボルです。ここでは、デリゲート、関数、フォンター、何でも構いません。あなたの先生がstd.functional.unaryFunを使っていれば、それは文字列でもあります。

Tパラメータは、C++と同様に、単なる型シンボルです。

この関数はファンクタを適用するだけです。ここでは最強バージョンです:

https://github.com/D-Programming-Language/phobos/blob/master/std/functional.d#L39

+0

「ファンクター」ではなく「ファンクター」です。 "func"は関数からのものです。 –

関連する問題