7

我一直在学习 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,我认为应该有“正确的方法”

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类型int的成员,其局部变量i是其别名

于 2011-11-08T12:58:41.597 回答