提升与方法的结合

时间:2015-06-09 10:14:48

标签: c++ boost boost-thread boost-bind

我尝试使用boost线程来多线程化我的一个应用程序。

我遇到问题的部分是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)返回,如你所能,RT。

我想要的是能够绑定我的方法,得到它返回的内容(RT),然后用以下内容进行处理:

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

我非常确定我通过将RT作为第二个参数来使用绑定错误。

在查看了其他一些StackOverflow问题后,我尝试了类似的内容:

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

所有这些都没有在VS2013中显示错误,直到编译时,弹出a:错误C2825:&#39; F&#39;:当后跟&#39; ::&#时必须是类或命名空间39;错误。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你误解了bind的作用。它束缚了争论。即它可以通过绑定Foo(x,y)Foo(3,y)变为x=3。您不绑定返回值。

相反,你需要的是一个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();

答案 1 :(得分:0)

Class::CalculateRT(i, i - 1)是一个函数调用,你试图获取调用本身的地址......

尝试类似:boost::bind(&Class::CalculateRT, i, i - 1)(要绑定的地址,参数跟随)。

如果您希望它为不同的i返回不同的值,则可能需要

boost::ref(i)

这是静态方法吗?然后它需要绑定this的值。

RT将是绑定调用的结果:

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