CClass inst;
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1);
在这种情况下, 我想从“func”访问inst的指针(&amp; inst)或地址,如下所示。
CClass* pInstance = func.obj_ptr; (This is just a form that I want)
我该怎么办?
答案 0 :(得分:4)
你做不到。 boost/std::function
的重点是擦除存储在其中的类型。要实现您所说的内容,需要重新构建类型。由于C ++是一种静态类型语言,这意味着调用此类函数的代码必须显式提供返回的类型。类似于func.value<TypeName>()
。
更重要的是,即使有可能,你所说的也是不可能的。 function
知道的唯一类型是给出的类型。哪个是boost/std::bind
的返回值。如果不深入研究实现细节,那么这种类型就无法广泛使用。
所以你所要求的是不可能的。不是没有把它存放在别处。
答案 1 :(得分:2)
我想这个成员(参数)应该在boost :: function类中不公开。如果我是对的,你将无法做到。至少没有一些奇怪的操作。
如果你真的需要类似的东西并且是func对象的创造者,那么我现在能想象的最干净的方式是:
std::pair<boost::function<bool(int)>, CClass *> funcAndObj
,然后调用funcAndObj.first()
并从funcAndObj.second
获取指针。
答案 2 :(得分:1)
有一种方法,使用boost::function::target()
模板方法。但是由于boost::bind
返回未指定的类型,但是还没有提供访问参数的方法,您需要编写自己的binder函子。这是一些例子:
class MyClass
{
public:
void myMethod()
{
std::cout << "This is my Method" << std::endl;
}
};
struct MyFunctor
{
MyFunctor(MyClass* o, void (MyClass::*m)()): object(o),method(m){}
MyClass* object;
void (MyClass::*method)();
void operator() ()
{
return (object->*method)();
}
};
现在您可以访问:
MyClass myObject;
boost::function< void() > func= MyFunctor(&myObject, &MyClass::myMethod);
func();
assert( func.target<MyFunctor>()->object == &myObject );
与boost::any
相同,无法通过target
模板方法进行多态访问。