如何在"boost::function"中访问类实例(对象)指针?
How can I access class instance(object) pointer in "boost::function"?
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
模板方法。
相关文章:
- 对象实例化调用构造函数的次数太多
- 为什么C++无法识别我的对象实例化?
- 使用大括号和 : 符号的对象实例化
- 对象实例化与类型C++
- 如何在C++中传递lambda函数内部的对象实例
- 在 c++ 中重置大型对象实例的最佳方法是什么
- 从 QT Widget 对象实例访问 QT Widget 子成员
- C++阻止用户创建对象实例
- cpp 静态对象实例化
- C++:根据变量将同一对象实例化为多种类型之一
- 与 QML 共享C++对象实例
- C 对象实例被销毁后留在列表上
- vulkan vulkan.hpp从对象实例中获取opbject类型
- 用户创建的类对象实例化的未申请标识符
- 对象实例化后不输出
- 限制对象实例化堆
- C C#等价对象实例
- 在C 中运行时从指针访问对象实例
- 使用类/对象实例数据初始化对话框
- 未知的 C++ 对象实例化语法