D аналог c++ указатели на функции-члены, не обязательно делегаты
Я изучал 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, и я решил, что должен быть "правильный путь"
2 ответа:
Вы все еще можете использовать делегат здесь.
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
Вы можете взять страницу из
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
которого является псевдонимом