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 7

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 которого является псевдонимом