我使用Loki :: Functor进行回调,我希望在两个回调之间共享一个仿函数(具有合适的operator()
成员函数定义的对象)。这个仿函数需要保持状态,以便两个回调都能看到它。
快速测试显示,使用值传递的函数构造Loki仿函数与使用成员函数指针构造函数有不同的结果:
#include "loki/Functor.h"
struct Bar {
int x;
void inc() { ++x; }
int operator()() { return x; }
int get() { return x; }
};
Bar b;
Loki::Functor<int, Loki::NullType> f1(b);
Loki::Functor<int, Loki::NullType> f2(&b, &Bar::get);
Loki::Functor<int, Loki::NullType> f3(&b, &Bar::operator());
cout << f1() << endl; // prints '0'
cout << f2() << endl; // prints '0'
cout << f3() << endl; // prints '0'
b.inc();
cout << f1() << endl; // prints '0'
cout << f2() << endl; // prints '1'
cout << f3() << endl; // prints '1'
f2
表明使用成员函数指针和指向实例的指针会导致f1
的行为不同。然后f3
建议将自己作为在loki仿函数之间共享仿函数的可能方式。
我相信f1
与“复制语义”有关。由Loki :: Functor支持 - 创建了一个仿函数的副本,其x
具有新值,而f2
和f3
执行我想要的操作 - 实际实例由loki Functor因此在他们之间分享。
因此,我想知道f3
是否是将仿函数Bar
的同一实际实例绑定到两个loki仿函数(f2
&amp; {{ 1}}),或者是否有更好/更清晰的方式按照f3
语法的方式进行操作?