1

我将 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支持的“复制语义”有关 - 制作了仿函数的副本,它具有新值它们之间。xf2f3

因此,我想知道是否f3是将函子的相同实际实例绑定Bar到两个 loki 函子(f2& f3)的最佳方法,或者是否有更好/更清洁的方法来按照f1语法来做到这一点?

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

4

0 回答 0