Друзья!
Под утро уже не соображаю.
Есть у меня связанное, ветвистое такое дерево.
Время от времени надо по всем ветвям прогонять функции, которые являются членами класса (в моем случае 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
Помогите пожалуйста, если не трудно, а то совсем завяз
Здравствуйте, vlat456, Вы писали:
V> applyFunc(n->Outputs[i], method );
V>Помогите пожалуйста, если не трудно, а то совсем завяз
Так, все, пора спать
Вопрос снимается.
Бага там была не то чтобы в лишней скобке, а надо было dereference-ить указатель.
Здравствуйте, 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>>
Здравствуйте, sokel, Вы писали:
S>Ага, а для собственного метода ноды в этом случаем можно использовать std::mem_fun.
Если есть доступ к boost::bind, то я предпочитаю его. Хотя, конечно, std::mem_fun гораздо проще (и, вроде бы, дешевле).
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>