CClass inst;
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1);
在这种情况下,我想访问 inst 的指针(&inst)或来自“func”的地址,如下所示。
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);
在这种情况下,我想访问 inst 的指针(&inst)或来自“func”的地址,如下所示。
CClass* pInstance = func.obj_ptr; (This is just a form that I want)
我能怎么做?
你不能。的全部意义boost/std::function
在于擦除存储在其中的类型。要实现您正在谈论的内容,需要重新构建类型。由于 C++ 是一种静态类型语言,这意味着调用此类函数的代码必须显式提供返回的类型。类似的东西func.value<TypeName>()
。
更重要的是,即使可用,您所说的也不可能。唯一function
知道的类型是它被赋予的类型。这是 的返回值boost/std::bind
。如果不深入研究实现细节,这种类型就无法广泛使用。
所以你要求的是不可能的。并非没有自己将其存储在其他地方。
我想这样的成员(参数)不应该在 boost::function 类中公开。如果我是对的,你将无法做到。至少没有一些奇怪的操作。
如果您确实需要类似的东西并且是 func 对象的创建者,那么我现在能想象的最干净的方法是:
std::pair<boost::function<bool(int)>, CClass *> funcAndObj
,然后调用funcAndObj.first()
并从中获取指针funcAndObj.second
。
有一种方法,使用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