C++ 如何传递对象的方法';s类作为std::function?

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

我有一个函数需要获取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 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); });