检测“std :: function”是否指向“std :: shared_ptr”对象?

时间:2014-05-08 12:33:39

标签: c++11 stl

是否可以重新建立从std::function指针返回到std::shared_ptr<>对象实例的连接?我想知道哪个对象拥有这个std::function<>它的函数ptr。

例如:

class Foo {
public:
    void doIt1( int i );
    void doIt2( int i );
};

void f() {
    std::shared_ptr<Foo> ptr( new Foo );

    std::function<void(int)> fp = get_funcptr_from_somewhere();

    if( fp.target<void(int)>() == ptr ) {
        // I've found it!!
    }

}

问题是fp.target只是一个函数ptr,我可以再次从ptr构建一个函数指针但是我不知道该对象的哪个函数是没有意义的(有趣的是目标报告nullptr如果对象已被删除)。哪个有帮助,但还是有任何其他可能性来关联std :: function&lt;&gt;对象是现有的std :: shared_ptr实例吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

C ++标准为[function.objects](12.8)中的函数对象定义了它们的名称及其效果。它没有指定具体的实现。

因此,如果你有一个std::function函数对象,就无法知道它将调用什么参数的函数。

答案 1 :(得分:1)

首先,ptr不可调用,因此不能成为std::function<void(int)>的目标。可以作为std::function<void(int)>目标的唯一对象是可以使用(int)调用的对象。

每个std::shared_ptr通常都是如此 - 没有可调用的std::shared_ptr,因此它们永远不是target的{​​{1}}。

如果您可以std::function查看某些object( blah ),则可以调用对象。

如果存储的可调用对象完全是blah类型,则

target<X>()仅返回非nullptr。如果您存储了Xbind表达式,则表示无法将其恢复原状。

您可以进行安排,以便使用非常特殊的类型以非常特殊的方式构造mem_fun,并在std::function的子集上使用std::function来提取背景对象,但这通常不是一种有用的技术,而是用于狭隘的特殊情况。