0
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)

我能怎么做?

4

3 回答 3

4

你不能。的全部意义boost/std::function在于擦除存储在其中的类型。要实现您正在谈论的内容,需要重新构建类型。由于 C++ 是一种静态类型语言,这意味着调用此类函数的代码必须显式提供返回的类型。类似的东西func.value<TypeName>()

更重要的是,即使可用,您所说的也不可能。唯一function知道的类型是它被赋予的类型。这是 的返回值boost/std::bind。如果不深入研究实现细节,这种类型就无法广泛使用。

所以你要求的是不可能的。并非没有自己将其存储在其他地方。

于 2012-05-16T11:11:48.340 回答
2

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

如果您确实需要类似的东西并且是 func 对象的创建者,那么我现在能想象的最干净的方法是: std::pair<boost::function<bool(int)>, CClass *> funcAndObj,然后调用funcAndObj.first()并从中获取指针funcAndObj.second

于 2012-05-16T11:07:19.390 回答
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

于 2012-05-16T20:58:35.377 回答