Указатель на метод класса и рекурсия
От: vlat456  
Дата: 10.08.09 02:01
Оценка:
Друзья!

Под утро уже не соображаю.

Есть у меня связанное, ветвистое такое дерево.
Время от времени надо по всем ветвям прогонять функции, которые являются членами класса (в моем случае Node).
Чтобы для каждой функции не городить огород с рекурсией — решил написать один метод для этого дела,
которому скармливается тот метод, что надо прогнать.
Но вот не разберусь, как вызывать метод через указатель в рекурсии. Ниже код:

void Network::applyFunc(Node *n, void(Node::*method)()) // Я горжусь этой штукой!
{
    (n->*method)();
    for (int i=0; i < n->Outputs.size(); i++)
    {
        applyFunc(n->Outputs[i], /*вот тут собака порылась*/ &Node.*method() );
    }
}


1>.\Network.cpp(21) : error C2275: 'Node' : illegal use of this type as an expression


Помогите пожалуйста, если не трудно, а то совсем завяз
Re: Указатель на метод класса и рекурсия
От: Bell Россия  
Дата: 10.08.09 02:16
Оценка:
Здравствуйте, vlat456, Вы писали:


V>    applyFunc(n->Outputs[i], method );

Любите книгу — источник знаний (с) М.Горький
Re: Указатель на метод класса и рекурсия
От: vlat456  
Дата: 10.08.09 02:17
Оценка:
V>Помогите пожалуйста, если не трудно, а то совсем завяз

Так, все, пора спать Вопрос снимается.
Бага там была не то чтобы в лишней скобке, а надо было dereference-ить указатель.
Re: Указатель на метод класса и рекурсия
От: Кодт Россия  
Дата: 10.08.09 12:12
Оценка: +3
Здравствуйте, vlat456, Вы писали:

V>Есть у меня связанное, ветвистое такое дерево.

V>Время от времени надо по всем ветвям прогонять функции, которые являются членами класса (в моем случае Node).
V>Чтобы для каждой функции не городить огород с рекурсией — решил написать один метод для этого дела,
V>которому скармливается тот метод, что надо прогнать.

Почему ограничился методами данного экземпляра данного класса?
Можно передавать произвольную функцию
template<class F> void /*static*/ forEachNode(Node* node, F fun)
{
    fun(node);
    std::for_each(node->Outputs.begin(), node->Outputs.end(), boost::bind(forEachNode<F>, _1, fun));
    // ну или в цикле :)
}

.....
forEachNetwork( this->RootNode, boost::bind(&Network::DoIt, this, _1) );
.....
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: Указатель на метод класса и рекурсия
От: sokel Россия  
Дата: 11.08.09 18:41
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Почему ограничился методами данного экземпляра данного класса?

К>Можно передавать произвольную функцию

Ага, а для собственного метода ноды в этом случаем можно использовать std::mem_fun.
Re[3]: Указатель на метод класса и рекурсия
От: Кодт Россия  
Дата: 12.08.09 09:22
Оценка:
Здравствуйте, sokel, Вы писали:

S>Ага, а для собственного метода ноды в этом случаем можно использовать std::mem_fun.


Если есть доступ к boost::bind, то я предпочитаю его. Хотя, конечно, std::mem_fun гораздо проще (и, вроде бы, дешевле).
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.