2012-05-16 111 views
0
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) 

我该怎么办?

+0

你想从哪里访问func的内部?它是在'func'定义的相同范围内,还是来自'func'传递给函数的范围内? – irobot

回答

1

有一种方法,使用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模板方法。

2

我猜这样的成员(参数)应该在boost :: function类中不公开。如果我是对的,你将无法做到。至少没有一些奇怪的操作。

如果你确实需要类似的东西是FUNC对象的创造者,最干净的方式,我现在可以想像的是: std::pair<boost::function<bool(int)>, CClass *> funcAndObj,然后调用funcAndObj.first(),并从funcAndObj.second得到的指针。

4

你不能。 boost/std::function的整点是擦除存储在其中的类型。要实现你正在谈论的内容,需要重新构建类型。由于C++是一种静态类型的语言,这意味着调用这种函数的代码将不得不明确提供返回的类型。像func.value<TypeName>()

此外,即使可用,您所谈论的内容也是不可能的。 function知道的唯一类型是给出的类型。这是boost/std::bind的返回值。如果不深入实施细节,这种类型不是广泛可用的。

所以你所要求的是不可能的。不是没有把它存储在别处。