如何在“boost :: function”中访问类实例(对象)指针?

时间:2012-05-16 10:36:02

标签: c++ boost member-function-pointers boost-function

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)

我该怎么办?

3 个答案:

答案 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模板方法进行多态访问。