我想从函数对象中检索状态。但是函数对象已经转换为function<>
模板。我该怎么办?
我的意思是:
功能对象:
class Counter {
private:
int counter_;
public:
Counter():counter_(0) {cout << "Constructor() called" << endl;}
Counter(int a):counter_(a) {cout << "Constructor(a) called" << endl;}
void operator()(int sum) {
cout << counter_++ + sum << endl;
}
int getCounter() { return counter_;}
};
主要。我的第一步是直接使用对象:
int main() {
Counter a(10);
a(0);
a(0);
cout << "Counter: " << a.getCounter() << endl;
它的节目:
构造函数(a)调用
10
11
柜台:12
没关系,这就是我的预期。
但是在
Counter b(10);
function<void(int)> f = b;
f(0);
f(0);
cout << "Counter: " << b.getCounter() << endl;
显示
构造函数(a)调用
10
11
柜台:10
唉!我认为f是真实对象的包装器,所以修改f
我们真的修改了b
。否:f
有b
的副本,但我无法致电f.getCounter()
所以如何从f
获取州(counter_ var)?
我不能直接使用Counter
类(在这个例子中),因为我有一些其他类似的类具有相同的签名“void(int)”我想在调用函数中隐约使用它们。
我完全可以使用std::function
模板为我的所有函数对象使用公共基类,但我认为有一个解决方案,更多的是带有STL和模板的C ++ 11 ......
那么,有解决方案吗?
由于
答案 0 :(得分:3)
从参考包装器创建函数:
function<void(int)> f = std::ref(b);
给出结果:
Constructor(a) called
10
11
Counter: 12
当然,您需要确保在销毁计数器后不调用该函数。
如果您需要从函数对象访问计数器,请使用其target
成员:
if (Counter * c = f.target<Counter>()) {
std::cout << "Counter: " << c->getCounter() << '\n';
} else {
std::cout << "Not a counter.\n";
}
答案 1 :(得分:2)
这不是演员:
function<void(int)> f = b;
构建了std::function
,并以函数对象的副本作为目标。
您可以使目标成为对函数对象的引用:
function<void(int)> f = std::ref(b);
或者让f
包含副本,然后从f
Counter* c = f.target<Counter>();
cout << "Counter: " << c->getCounter() << endl;
让f
包含副本通常更安全,因为您不必担心b
的生命周期。