Указатель на функцию-член C++
Рассмотрим следующий класс
class Foo
{
typedef bool (*filter_function)(Tree* node, std::list<std::string>& arg);
void filter(int filter, std::list<std::string>& args)
{
...
if (filter & FILTER_BY_EVENTS) {
do_filter(events_filter, args, false, filter & FILTER_NEGATION);
}
...
}
void do_filter(filter_function ff, std::list<std::string>& arg,
bool mark = false, bool negation = false, Tree* root = NULL)
{
...
}
bool events_filter(Tree* node, std::list<std::string>& arg)
{
...
}
};
Я могу передать events_filter
в качестве параметра do_filter
только тогда, когда events_filter
является членом static
. Но я не хочу этого делать static
. Есть ли способ, которым я могу передать указатель на функцию-член другой функции? Может использоватьсяboost библиотеки (например, функция) или так.
Спасибо.
2 ответа:
bool (Foo::*filter_Function)(Tree* node, std::list<std::string>& arg)
Даст вам указатель на функцию-член. Вы проходите один с:Foo f; f.filter(&Foo::events_filter,...);
И вызвать его с помощью:
(this->*ff)(...); // the parenthesis around this->*ff are important
Если вы хотите иметь возможность передавать любой вид функции / функтора, который следует вашему синтаксису, используйте Boost.Function , или если ваш компилятор поддерживает его, используйте функцию std::.
А потом передавайте все, что хотите. Функтор, свободная функция (или статическая функция-член) или даже нестатическая функция-член с повышением.Bind или std:: bind (снова, если ваш компилятор поддерживает его):class Foo{ typedef boost::function<bool(Tree*,std::list<std::string>&)> filter_function; // rest as is };
Foo f; f.do_filter(boost::bind(&Foo::events_filter,&f,_1,_2),...);
//member function pointer is declared as bool (*Foo::filter_function)(Tree* node, std::list<std::string>& arg); //Usage //1. using object instance! Foo foo; filter_function = &foo::events_filter; (foo.*filter_function)(node, arg); //CALL : NOTE the syntax of the line! //2. using pointer to foo (pFoo->*filter_function)(node, arg); //CALL: using pFoo which is pointer to Foo (this->*filter_function)(node, arg); //CALL: using this which is pointer to Foo