我想知道如何将“this”指针传递给类中的方法。 让我们看看这段代码:
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;
}
假设绑定就像一个函数对象,它以某种方式传递这个/对象指针。如果我想明确地执行此操作,则会出现编译错误。
它实际上是如何运作的?
答案 0 :(得分:2)
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
来确保它所包装的对象可以被统一调用。