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

How can I access class instance(object) pointer in "boost::function"?

本文关键字:对象 实例 指针 boost function 访问      更新时间:2023-10-16
CClass inst;
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1);

在这种情况下,我想从"func"访问 inst 的指针(&inst(或地址,如下所示。

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返回未指定的类型,witch 尚未提供访问参数的方法,因此您需要编写自己的绑定器函子。下面是一些示例:

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模板方法。