是否可以重新建立从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实例吗?
非常感谢!
答案 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
。如果您存储了X
或bind
表达式,则表示无法将其恢复原状。
您可以进行安排,以便使用非常特殊的类型以非常特殊的方式构造mem_fun
,并在std::function
的子集上使用std::function
来提取背景对象,但这通常不是一种有用的技术,而是用于狭隘的特殊情况。