我已经阅读了here关于boost:bind如何工作,特别是它 - 除了其他东西 - 产生这样的东西:
struct unspecified_type
{
... some members ...
return_type operator()(int i) const { return instance->*&klass::member(0, i);
}
现在,我正在寻找一些允许向实例指针添加额外间接的东西,以便最终看起来像这样:
struct unspecified_type
{
... some members ...
return_type operator()(int i) const { return (*p_instance)->*&klass::member(0, i);
}
可以像
一样使用MyClass* pmc;
auto mfp = boost::bind(&MyClass::some_func, &pmc);
pmc = new MyClass();
mfp();
pmc = new MyClass();
mfp();
答案 0 :(得分:2)
您可以使用std::bind
和std::ref
或它们的等效增强(但由于您使用的是C ++ 11,因此您可能需要使用标准类和函数)。所以给这个班:
#include <iostream>
struct MyClass
{
int x;
MyClass(int x_) : x(x_) { }
void some_func()
{
std::cout << x << std::endl;
}
};
您可以在std::reference_wrapper
中传递要调用成员函数的指针。另外,请避免使用new
(和delete
!),而更喜欢使用智能指针来建模对象所有权:
#include <functional>
#include <memory>
int main(int argc, char *argv[])
{
std::shared_ptr<MyClass> pmc;
auto mfp = std::bind(&MyClass::some_func, std::ref(pmc));
pmc = std::make_shared<MyClass>(42);
mfp();
pmc = std::make_shared<MyClass>(1729);
mfp();
}
这是live example。
答案 1 :(得分:0)
从技术上讲,您可以使用boost::bind
函数扩展std::bind
(但不是get_pointer
):
#include <boost/bind.hpp>
struct MyClass
{
void some_func()
{}
};
namespace boost
{
template<class T>
T *get_pointer(T **t)
{
return *t;
}
}
int main()
{
MyClass *pmc;
auto mfp = boost::bind(&MyClass::some_func, &pmc);
pmc = new MyClass();
mfp();
pmc = new MyClass();
mfp();
}