Мой план состоит в том, чтобы создать несколько классов слушателей, которые имеют предопределенные «ловушки обратного вызова».
В приведенном ниже примере класса Foo
имеет «обратный вызов» называется onChange
, Во время создания будет установлена функция обратного вызова по умолчанию. Он также может быть установлен на произвольную функцию, которая обеспечивает правильный интерфейс, как показано с объектом f1
и функция callback()
,
Проблема в том, когда я хочу вызвать объект-член onChange
внутри цикла for компилятор говорит, что я привожу много аргументов. я знаю о проблеме, что я не предоставляю функцию-член std::mem_fn
но вместо этого член объекта, который является оберткой функции.
Как мне удается передать аргумент std::function
член объекта класса Foo
без использования std::bind
и использовать std::mem_fn
вместо того, как показано в примере?
struct Foo
{
Foo()
{
// default callback
onChange = [](int value)
-> void { std::cerr << "Foo::onChange( " << value << " )" << std::endl; };
}
// class destructor
virtual ~Foo() {}
std::function<void(int value)> onChange;
};void callback(int value)
{
std::cerr << "callback( " << value << " )" << std::endl;
}int main()
{
Foo f0;
Foo f1;
f1.onChange = callback;
auto vec = std::vector<Foo>();
vec.push_back(f0);
vec.push_back(f1);
auto func_wrapper = std::mem_fn( &Foo::onChange );
for (auto f : vec)
{
func_wrapper(f, 42);
}
}
Задача ещё не решена.