CClass inst;
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1);
在这种情况下,我想从下面的“func”访问inst的指针(& inst)或地址。如何访问“boost :: function”中的类实例(对象)指针?
CClass* pInstance = func.obj_ptr; (This is just a form that I want)
我该怎么办?
CClass inst;
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1);
在这种情况下,我想从下面的“func”访问inst的指针(& inst)或地址。如何访问“boost :: function”中的类实例(对象)指针?
CClass* pInstance = func.obj_ptr; (This is just a form that I want)
我该怎么办?
有一种方法,使用boost::function::target()
模板方法。但由于boost::bind
返回未指定类型,女巫尚未提供访问参数的方式,因此您需要编写自己的绑定器函子。下面是一些例子:
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
模板方法。
我猜这样的成员(参数)应该在boost :: function类中不公开。如果我是对的,你将无法做到。至少没有一些奇怪的操作。
如果你确实需要类似的东西是FUNC对象的创造者,最干净的方式,我现在可以想像的是: std::pair<boost::function<bool(int)>, CClass *> funcAndObj
,然后调用funcAndObj.first()
,并从funcAndObj.second
得到的指针。
你不能。 boost/std::function
的整点是擦除存储在其中的类型。要实现你正在谈论的内容,需要重新构建类型。由于C++是一种静态类型的语言,这意味着调用这种函数的代码将不得不明确提供返回的类型。像func.value<TypeName>()
。
此外,即使可用,您所谈论的内容也是不可能的。 function
知道的唯一类型是给出的类型。这是boost/std::bind
的返回值。如果不深入实施细节,这种类型不是广泛可用的。
所以你所要求的是不可能的。不是没有把它存储在别处。
你想从哪里访问func的内部?它是在'func'定义的相同范围内,还是来自'func'传递给函数的范围内? – irobot