2

デリゲートを受け入れる関数を定義すると、D はその関数を呼び出すときにデリゲート引数を型推論できます。したがって、署名付きの関数を作成すると、次のようになります。

void foo(void delegate(int,string) dlg)

次を使用して呼び出すことができます:

foo((a,b){});

aD はisintbisを推測しstringます。

しかし、デリゲートが持つ引数の数が事前にわからない場合はどうすればよいでしょうか? 私が書くなら

void foo(T...)(void delegate(T) dlg)

私は呼び出すことができます:

foo((int a,string b,char c,boolean d){});

ただし、引数ごとに型を指定する必要がありました。

ここで、任意の数の引数 (すべて同じ型) をfoo持つデリゲートを受け入れたいと考えています。だから私は呼び出すことができます:

foo((a,b,c,d,e,f,g){});

aD はtogがすべてstringsであると推論します。

私が必要としているのは可変長関数ではないことに注意してください。dlgそれ自体は任意の数の引数を受け入れません。任意の数の引数fooを持つデリゲートを受け入れます。

Dでこれを行うことは可能ですか?

EDIT
実際には、デフォルトの引数を定義できれば良いので、書くことができます

foo((a,b,int c,d){});

a、は文字列になりますが、bはになります。dcint

4

1 に答える 1

3

それは機能強化の要求である可能性があります。しかし今のところ、コンパイル時にエイリアスとして渡すことができます:

import std.stdio;

void foo(alias dlg)()
{
    dlg(1, 2.0, [3], "a");
    dlg(1.0, 2, [[3]], "b");
}

void main()
{
    foo!((a, b, c, d) { writefln("%s %s %s %s", a, b, c, d); } )();
}
于 2013-03-20T01:59:59.973 に答える