2016-11-20 7 views
1

fooは、別の関数fと不明な型のデータdを取ります。関数の定義時に返される型がfでなく、タイプがdではない場合、関数の宣言はどのように指定できますか?それは私が次のようなものを表現できるか、である:_はタイプのワイルドカード/キャッチオール一致を示すパラメータ宣言:不明な型の関数を渡すD

void foo(_ f, _ d) { 
    // .. 

拡張子別の質問:IDが何でもかまいませんが、型が同じであることを指定することはできますか?言い換えれば、_は任意のタイプかもしれませんが、タイプは同じである必要があります。

+0

よく見ると、テンプレート(https://dlang.org/spec/template.html)デザインされているo関数を汎用的にする方法を提供することで、これらの問題の解決に役立ちます。他の方法を示唆するような気があれば、教えてください。 –

答えて

2

関数は型を知っている必要があります。そうでなければコードを生成するのはかなり難しく、リンカーは確かにそれらに対処できませんでした。つまり、C++のように、Dにはテンプレートがあるため、関数テンプレートを宣言して、関数自体を生成し、それを使用するコードをコンパイルするときにコンパイルすることができます。したがって、同じ型の2つの引数を取りますが、さまざまな型で動作する関数を必要とする場合は、関数テンプレートを使用することになります。例えば

void foo(T)(T a, T b) 
{ 
    ... 
} 

または複数のタイプが必要とされた場合、あなたはどちらの場合も

void foo(T, U)(T a, U b) 
{ 
    ... 
} 

ような何かを行うことができ、コードはその後、fooを呼び出すときに、パラメータの型が型から、コンパイラによって推測されます実際の議論の異なる引数型を持つ同じ関数テンプレートを呼び出すと、コンパイラによって追加の関数が生成されます。公式ドキュメントの関連部分はここにある:

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

しかし、オンラインブックからこの章では、おそらくより多くの情報を次のようになります。

http://ddili.org/ders/d.en/templates.html

私はあなたが読んで検討することをお勧めしたいですあなたがDの基礎をたくさん説明してくれるものを望むならば、全体の本(または少なくともそれを見て)。

関連する問題