7

私は D を学んでおり、特に D のジェネリック プログラミング機能に非常に興奮しています。デリゲートは素晴らしく、メンバー関数ポインターを完全に置き換えたようです。そのため、次のようなものを実装したいときに行き詰まりました。

template <typename T>
void DispatchMethodForAll(std::vector<T*> & container, void (T::* func)(void))
{
  for(typename std::vector<T*>::iterator it = container.begin(); it != container.end(); ++it)
      (*it)->*func();
}

D の関数ポインターとデリゲートについて私が学んだことによると、関数ポインターはグローバル関数に対してのみ宣言でき、デリゲートはオブジェクトにバインドする必要があるため、どちらもこれを行うことができないということです。 "私が見つけることができます。ここに示すように、呼び出されるメソッドにバインドできる単一のオブジェクトがないため、デリゲートを使用できません。

私はミックスインでそれを行うことができ、本質的にそれをマクロにすることができることを知っています. しかし、これは本当に D のようには聞こえず、「正しい方法」があるべきだと考えました。

4

2 に答える 2

6

ここでもデリゲートを使用できます。

void DispatchMethodForAll(T)(T*[] container, void delegate(T*) action)
{
    foreach (it; container)
        action(it);
}

...

DispatchMethodForAll(container, (Foo* foo) { foo.func(); });

例: http://www.ideone.com/9HUJa

于 2011-11-08T09:14:30.180 に答える
3

からページを取り出して、std.algorithmそれがどのように行われるかを確認できます

void DispatchMethodForAll(alias func, T)(T container)
{
    alias unaryFun!func _func
    foreach (it; container)
        _func(it);
}

ところで、デリゲートは構造体にバインドでき、コンパイラはローカル (スタックに割り当てられた) 変数からカスタム構造体を作成し、その上にデリゲートを定義できます。

これは

void foo(){
    int[] array;
    int i=0;
    void bar(int a){
        i+=a;
    }
    void DispatchMethodForAll(&bar)(array);
    writeln(i);//prints the sum of array
}

bar(少なくとも)ローカル変数がエイリアスであるi型のメンバーを持つ構造体にバインドされたデリゲートですinti

于 2011-11-08T12:58:41.597 に答える