如何在两个Loki Functors之间正确分享状态的仿函数?

时间:2014-01-25 22:16:00

标签: c++ state functor loki

我使用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具有新值,而f2f3执行我想要的操作 - 实际实例由loki Functor因此在他们之间分享。

因此,我想知道f3是否是将仿函数Bar的同一实际实例绑定到两个loki仿函数(f2&amp; {{ 1}}),或者是否有更好/更清晰的方式按照f3语法的方式进行操作?

编辑:有些人可能会问为什么我使用Loki的年龄?它在受限制的开发环境中提供了我需要的东西,其中严格禁止全局静态(我必须从loki / Functor.h中删除Small Object单例,但这很容易)。如果有人对替代广义仿函数库提出建议,很高兴详细说明约束。

0 个答案:

没有答案