基本上,我希望具有以下语义:
#include <functional>
#include <iostream>
class test
{
public:
void add(std::function<void()> f)
{
f();
}
void operator()()
{
++x;
}
int x = 33;
};
int main()
{
test t;
t.add(t);
// wanted: x == 34 instead: x == 33 since add(t) copies it
}
我了解std :: function包装可调用对象的副本,但是有什么方法可以使用std :: function获得对可调用对象的引用?
您想使用std::ref
模板功能为您的实例创建std::ref
:
reference wrapper是一个类模板,它将引用包装在可复制的可分配对象。
功能模板
std::reference_wrapper
和ref
是帮助函数,可生成类型为cref
的对象,使用模板参数推导以确定结果的模板参数。
您会这样使用它:
std::reference_wrapper
[另一种方法是传入lambda-将t绑定为参考:
t.add(std::ref(t));
对我来说,这似乎更具可读性(但仅是因为我熟悉lambda而不是std :: bind)。这种区别也许让人想起斯科特·迈耶斯(Scott Meyers)的作品[[Effective Modern C ++,#34:更喜欢Lambdas而不是std :: bind。