2010-12-03 17 views
10

誰かが以下のコードを説明することはできますか?この場合、isNumericTがどのように動作するのかを理解しようとすると、混乱します。Dプログラミングのテンプレート

auto foo(T)(T n) if (isNumeric!T) { 
    return (T m) {return m > n;}; 
} 

void main() { 
    auto hoo5 = foo!int(1000); 
    writeln(hoo5(93)); 
    writeln(hoo5(23)); 
} 

答えて

13

スタートで:

auto foo(T)(T n) if (isNumeric!T) { 
    // ignore this for now 
} 

fooがそのジェネリック型の1つの引数をとる汎用関数です。 if (isNumeric!T)は、std.traitsのコンパイル時のチェックで、fooの型が数値であることを保証します。数値以外の型は機能しません。戻り値の型は推測され、この場合は代理人です。

これ:

(T m) {return m > n;}; //returned from foo 

delegate literalor closure)です。これは基本的に状態を持つ関数ポインタです。この場合、fooに渡されたパラメータnをクローズします。あなたの例では:

auto hoo5 = foo!int(1000); 

が効果的に機能に翻訳されています。あなたは hoo5を呼び出すときに、それはその引数が1000以上であるかどうかを示すbooleanを返し

bool hoo5 (int x) { return x > 1000; } 

- しかし、あなたの特定のケースで。

あなたはこのようなFOO呼び出す場合:

auto hoo5 = foo!double(1.2345); 

をあなたは、その引数(ダブル)が1.2345以上であるかどうかを示すブール値を返す関数への参照を取得します。

+0

タイプミスがあります。私はそれを修正しました。ありがとう! – Nate

+1

あなたは本当にうまく説明します。私は今それを理解する。ありがとうございました。 – Nate

関連する問題