D模拟到C ++成员函数指针,不一定是委托

时间:2011-11-08 08:38:18

标签: delegates generic-programming d member-function-pointers

我一直在学习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中学到的函数指针和委托,是不是它们都不能这样做,因为函数指针只能为全局函数声明,并且委托必须绑定到一个对象,没有我能找到的“部分代表”。如此处所示,我不能使用委托,因为没有单个对象可以绑定到要调用的方法。

我知道我可以用mixins来做,并且基本上使它成为一个宏。然而,这听起来确实不像D,我认为应该有“正确的方法”

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

你可以从std.algorithm中取出一页以了解它是如何做到的

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

btw委托可以绑定到结构,编译器可以从本地(堆栈分配)变量创建自定义结构并在其上定义委托

这种情况发生在

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的{​​{1}}类型,其中局部变量int是别名