2016-07-22 3 views
1

私は自分自身を教えています。私は、テンプレートに関連する質問に基本的なものがあるかもしれません。例えば、私は現在読んでいる記事は(この記事の一番下を参照してください)次のコードが含まれていますテンプレートの理解D

int foo(int x) 
{ 
    return x; 
} 

string foo(string x) 
{ 
    return x; 
} 

void main() 
{ 
    assert(foo(12345) == 12345); 
    assert(foo("hello") == "hello"); 
} 

は明らかに、この特定のスニペットは、エレガント未満とテンプレートが繰り返しを排除するであろう次のとおりです。

foo(T)(T x) 
{ 
    return x; 
} 

void main() 
{ 
    assert(foo!(int)(12345) == 12345); 
    assert(foo!(string)("hello") == "hello"); 
} 

2番目の例は、渡された値を返すだけなので、基本的です。私の混乱は、テンプレート化されているにも関わらず、関数のように表示され、文字列と整数値が共通していることを容易に想像することができないためです。したがって、渡される変数の型をチェックし、文字列または整数のケースを別々に処理するコードを記述することをプログラマが期待していますか?大規模な関数本体の作成は本当に効率的ですか?私は、テンプレート作成の不慣れが自明であることを認識しています。そこで、私の質問:)

http://nomad.so/2013/07/templates-in-d-explained/

+3

https://github.com/PhilippeSigaud/D-templates-tutorialでは、Dテンプレートに関する完全な本(無料)を見つけることができます。それは素晴らしい読書です。 – DejanLekic

答えて

4

は、「テンプレート」の文字通りの定義は、「コピーする他の人のためのモデルとして役立つ何か」であり、それは、コンパイラが何をするかです。それぞれの型(文字列とあなたの場合はint)に対して、テンプレート関数をコピーし、コンパイル時に特別な関数を作成します。

実行時にテンプレートが不要なため、コンパイル後に破棄することができます。コンパイルされたバイナリには、の2つのファンクションfoo!(int)foo!(string)があります。

プログラマは、渡される変数の型をチェックし、文字列または整数の大文字小文字を個別に処理するコードを記述することが期待されていますか?

時々あなたはそれをしたいと思う。たとえば、パフォーマンスを最適化する。時にはそれを行い、汎用関数を書く必要はありません。

大規模な関数本体を作成するのが本当に効率的ですか?

時には。もしそうでなければ、しないでください。たとえば、という1つの汎用findという関数を配列、リンクリストなどに使用できます。

1

テンプレートは、同じように処理したいタイプの再利用可能なコードです。したがって、 '文字列または整数の別々のケースを別々に処理したい場合は、おそらく適切なツールではありません。

T要素を含む任意のコンテナを例としてとります。文字列とintはあまり共通していなくても、それぞれのコンテナを作成することができます。

もう1つの例は、使用するタイプを指定できる数学的なベクトルです。 1つの型に制約されることなく数学関数を指定することができ、必要な演算子がオーバーロードされている場合はカスタム型でも動作します。

関連する問題