我将 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 函子之间共享函子的一种可能方式。
我相信与Loki:: Functorf1
支持的“复制语义”有关 - 制作了仿函数的副本,它具有新值它们之间。x
f2
f3
因此,我想知道是否f3
是将函子的相同实际实例绑定Bar
到两个 loki 函子(f2
& f3
)的最佳方法,或者是否有更好/更清洁的方法来按照f1
语法来做到这一点?
编辑:有些人可能会问,鉴于 Loki 的年龄,我为什么要使用它?它提供了我在受限开发环境中所需要的东西,在这种环境中严格禁止全局静态(但是我确实必须从 loki/Functor.h 中删除小对象单例,但这很容易)。如果有人对替代通用函子库有建议,很高兴详细说明约束。