我一直在学习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,我认为应该有“正确的方法”
答案 0 :(得分:6)
你仍然可以在这里使用代表。
void DispatchMethodForAll(T)(T*[] container, void delegate(T*) action)
{
foreach (it; container)
action(it);
}
...
DispatchMethodForAll(container, (Foo* foo) { foo.func(); });
答案 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
是别名