C++ 如何传递对象的方法';s类作为std::function?
我有一个函数需要获取std::function type参数。我还有一个指向对象的抽象类型指针。是否可以仅使用对象传递方法 函数签名:C++ 如何传递对象的方法';s类作为std::function?,c++,std-function,C++,Std Function,我有一个函数需要获取std::function type参数。我还有一个指向对象的抽象类型指针。是否可以仅使用对象传递方法 函数签名: voidfoo(std::function); 课程样本: class IBase // interface { public: virtual bool sampleMethod(int i) = 0; }; class Child1 : public IBase // one of the classes that inherit from IB
voidfoo(std::function);
课程样本:
class IBase // interface
{
public:
virtual bool sampleMethod(int i) = 0;
};
class Child1 : public IBase // one of the classes that inherit from IBase
{
public:
bool sampleMethod(int i) override;
};
因此,有一个指向其中一个子类的对象的指针:
std::unique_ptr<IBase> ptr;
std::unique_ptr ptr;
我想用它来传递sampleMethod作为foo的一个参数。
有没有办法使用STD或Boost? < P>这是C++,所以你要担心终身。你的问题完全忽略了生命;这是一件坏事 当你在C++中谈论任何事情时,你必须清楚所有相关的生命。要弄清楚这一点,一个方法是谈论所有权。另一个是说一件事是谈论范围 生命周期:
void foo(std::function<bool(int i)> f);
完成了;范围保证(ptr
超过对foo
的调用,并且f
及其副本将不超过foo
)的平均寿命被计算在内
但是,如果foo
可能保留f
的副本,则您有两个问题。首先,ptr
声称在*ptr
的生命周期内拥有唯一的所有权;但是f
还声明它要调用的对象的所有权
而且,std::function
可以复制;这意味着要么它调用的对象必须被复制,要么我们被迫拥有共享所有权
那么在foo
之后,*ptr
是否需要在外部可用?*ptr
的副本有意义吗,或者在*ptr
的f
副本之间共享所有权?更多的所有权问题,这些问题的答案会改变你问题的正确解决方案
在一个更完美的世界中,
函数
,仅移动函数
,函数
都将存在,您的选择将告知您需要什么,并简化孤子。您可以使用标准::绑定
和占位符:
foo (std::bind (&IBase::sampleMethod, ptr.get (), std::placeholders::_1));
您还可以使用lambda来捕获ptr
:
foo ([&ptr] (int i) { return ptr->sampleMethod (i); });
在这两种情况下,正如雅克-亚当·内夫劳蒙特所说的那样,确保ptr
在foo
中的引用或复制都比ptr更有效
最简单的方法是使用捕获lambda函数。
[&](int i){return ptr->sampleMethod(i);}
您看过CPP参考中的示例了吗?
foo ([&ptr] (int i) { return ptr->sampleMethod (i); });