Одно из решений состоит в том, чтобы шаблонизировать вашу функцию перемещения, чтобы получить функциональный объект. Затем вместо указания параметров в функции traverse
переместите эти параметры в объект функции и дайте возможность operator()
объекта функции обрабатывать детали при вызове:
template <typename func>
void LinkedBST<T>::traverse(Node *x, func fn)
{
if(x == nullptr)
return;
traverse(x->left, fn);
fn(x->val);
traverse(x->right, fn);
}
struct some_func
{
int param1;
int param2;
int param3;
some_func(int p1, int p2, int p3) : param1(p1), param2(p2), param3(p3) {}
void operator()(int node_value)
{
std::cout << "The node value is " << node_value << "\n";
// the parameters are param1, param2, param3
}
};
Когда вызывается operator()
(вызывается функция), теперь у вас есть значение узла плюс все параметры, которые вы установили внутри объекта.
Тогда можно сделать что-то подобное:
Node *node_ptr;
//...
LinkedBST<int> the_list;
//...
some_func f(1,2,3); // we want to use 1,2,3 as the parameters to the custom function
the_list.traverse(node_ptr, f);
Вот упрощенная версия , показывающая основы с использованием фиктивного класса.
Вы также можете использовать лямбду с этой техникой:
Node *node_ptr;
//...
LinkedBST<int> the_list;
//...
int arg1=1, arg2=2, arg3=3;
the_list.traverse(node_ptr,
[&](int node_value){std::cout << "The node value is " <<
node_value << "\n" << arg1 << " " <<
arg2 << " " << arg3;});