提升绑定到方法

Boost Bind to Method

我正在尝试使用 boost thread 对我的一个应用程序进行多线程处理。

我有问题的部分是 boost::bind

这是我正在尝试做的事情:

boost::bind(&Class::CalculateRT(i, i - 1), RT));

正在考虑:

RT is a TransformType 
typedef std::pair<Eigen::Matrix3d, Eigen::Vector3d> TransformType;

CalculateRT 是一种方法: TransformType Class::CalculateRT(int i, int j) 其中 returns,如您所料,RT .

我想要的是能够绑定我的方法,得到它returns(RT)然后用类似的东西线程化它:

boost::thread MultiThreadingRTCalculation(boost::bind(&Class::CalculateRT(i, i - 1), RT));

我很确定我将 RT 作为第二个参数来使用 bind 是错误的。

在查看了其他一些 Whosebug 问题后,我尝试了这样的操作:

boost::function<TransformType()> BoostFunction(boost::bind(&Class::CalculateRT(i, i - 1), RT));

所有这些直到编译时才在 VS2013 中显示错误,它会弹出:错误 C2825: 'F': must be a class or namespace when followed by '::' 错误.

感谢您的帮助!

Class::CalculateRT(i, i - 1) 是函数调用,您尝试获取调用本身的地址...

试试这样的东西:boost::bind(&Class::CalculateRT, i, i - 1)(要绑定的地址,后面是参数)。

boost::ref(i) 如果您希望它 return 不同的值,则可能需要

这是静态方法吗?然后它需要在 bind.

中为 this 赋值

RT 将是绑定调用的结果:

boost::function<TransformType()> boundFunction = bind(........);
TransformType RT = boundFunction();

您误解了 bind 的作用。它绑定参数。 IE。它可以通过绑定x=3Foo(x,y)变成Foo(3,y)。您没有绑定 return 值。

相反,您需要的是一个 lambda:[&RT, i](){RT = Class::CalculateRT(i, i - 1)

当然,如果CalculateRT是一个非静态方法,那么你需要一个来自某处的Class对象。

使用:

TransformType RT;
auto boundFunction = [&RT, i](){RT = Class::CalculateRT(i, i - 1);
std::thread(boundFunction).detach(); // Doesn't wait for the assignment!

当然,如果你想依赖RT的结果,你可以join()线程代替。但是到那个时候,你真的需要一个线程和一个绑定函数吗?

 auto background = std::sync(std::launch::async, &Class::CalculateRT, i,i-1);
 // Do stuff in the foreground.
  RT = background.get();