提升绑定到方法
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=3
将Foo(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();
我正在尝试使用 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=3
将Foo(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();