指向方法的指针/传递这个指针/ boost::bind
Pointer to the method / passing this pointer / boost::bind
我想知道"这个"指针是如何从类传递给方法的。让我们看看这段代码:
class CTest
{
public:
CTest(int n_) : n(n_) {}
void method()
{
std::cout << n << std::endl;
}
private:
int n;
};
int main()
{
CTest t1(100);
boost::bind(&CTest::method, &t1)(); //100
boost::bind(&CTest::method, _1)(&t1); //100
Test::method(&t1); //no matching function for call to ‘CTest::method(CTest*)’
return 0;
}
假设绑定像函数对象一样工作,它以某种方式传递这个/object指针。如果我想显式地这样做,我会得到一个编译错误。
它实际上是如何工作的?
boost::bind
识别出它包装的目标是指向成员的指针,并使用不同的代码路径使用指向成员的指针的正确语法来调用它。
bind
可以对它的目标应用一个转换,这样一个指向成员的指针将被改编成一个可以像普通的函数对象一样调用的东西,并照顾细节,所以bind
本身不需要知道细节。
函数boost::mem_fn
可用于将指向成员的指针转换为可调用对象:
void (CTest::*memptr)() = &CTest::method;
CTest* p = &t1;
auto callable = boost::mem_fn(memptr);
callable(p); // calls (p.->*memptr)()
所以给定这个适配器,bind
只需要确保它在需要的时候被使用。
在GCC实现中,我们有这样的东西:
template<class T>
struct maybe_wrap_mem_ptr
{
typedef T type;
};
// partial specialization for pointer to member
template<class R, class C>
struct maybe_wrap_mem_ptr<R C::*>
{
typedef mem_fn_wrapper<R C::*> type;
};
template<class T>
typename maybe_wrap_mem_ptr<T>::type
wrap_mem_ptr(T t)
{ return typename maybe_wrap_mem_ptr<T>::type(t); }
其中mem_fn_wrapper
是std::mem_fn
函数返回的类型。所以bind
可以使用wrap_mem_ptr
来确保它所包装的对象可以被统一调用
相关文章:
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- boost::spirit指针属性是用nullptr初始化的吗?
- 序列化和反序列化boost共享指针
- C++ 从 Boost object_pool构造的指针的 Boost 二进制序列化
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- 使用 boost::序列化将派生类指针序列化为向量时出现问题
- 获取“boost::文件系统::p ath”字符指针时出现问题
- 将 boost::function 与指向派生类的共享指针的参数一起使用
- 如何将Protobuf的Boost :: Shared_ptr指针传递给功能
- BOOST-ASIO ASYNC_RECEIVE_FROM功能超载问题( 动态指针)
- boost::compute,将指针传递给闭包
- 如何使用boost::graph dijkstra的算法,如果顶点属性是指针?
- Boost Python:指针设置为空
- 将 boost::object_pool 与矢量一起使用时指针无效
- Boost ::与指针与值的混淆
- boost::shared_ptr来自指针
- 如何从“boost::function”中获取 C 指针(如 'var (*)(vo
- 指向方法的指针/传递这个指针/ boost::bind
- 将Base1指针转换为Base2指针(boost shared_ptr)