【问题标题】:How can I access class instance(object) pointer in "boost::function"?如何访问“boost::function”中的类实例(对象)指针?
【发布时间】:2012-05-16 10:36:02
【问题描述】:
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)

我该怎么办?

【问题讨论】:

  • 您想从哪里访问func 的内部信息?它是来自定义func 的同一范围内,还是来自传递给func 的函数范围内?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    如果你真的需要类似的东西并且是 func 对象的创建者,我现在能想象的最干净的方法是: std::pair&lt;boost::function&lt;bool(int)&gt;, CClass *&gt; funcAndObj,然后调用funcAndObj.first(),从funcAndObj.second获取指针。

    【讨论】:

      【解决方案3】:

      有一种方法,使用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 模板方法无法进行多态访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多