如何在 ROS2 的 create_subscription 方法中使用 lambda 而不是 std::bind
How to use lambda intead of std::bind in create_subscription method in ROS2
我正在为点云创建一个小型欧氏聚类节点,利用 PCL 的 KD 树实现。
目前,我的订户定义如下所示,
ClusteringNode::ClusteringNode(const rclcpp::NodeOptions &options)
: Node("clustering_node", options),
cloud_subscriber_{create_subscription<PointCloudMsg>(
"input_cloud", 10,
std::bind(&ClusteringNode::callback, this,
std::placeholders::_1))},
KD-tree 方法的定义在回调方法中并且运行良好,
现在为了进一步改进,我想在这里使用 lambdas 代替 std::bind 函数,
这里的方法应该是什么?
你可以替换
std::bind(&ClusteringNode::callback, this, std::placeholders::_1)
与
[this](auto&& var){ return callback(std::forward<decltype(var)>(var)); }
// or if no return value
[this](auto&& var){ callback(std::forward<decltype(var)>(var)); }
如果不需要支持完美转发,可以缩短为
[this](const auto& var){ return callback(var); }
// or if no return value
[this](const auto& var){ callback(var); }
这对我有用,
ClusteringNode::ClusteringNode(const rclcpp::NodeOptions &options)
: Node("clustering_node", options),
cloud_subscriber_{create_subscription<PointCloudMsg>(
"input_cloud", 10,
[this] (const PointCloudMsg::SharedPtr msg){
callback(msg);
})},
std::bind()
语句:
std::bind(&ClusteringNode::callback, this, std::placeholders::_1)
会翻译成这样的 lambda:
[this](const auto msg){ callback(msg); }
或者,如果 callback()
具有非 void
return 值:
[this](const auto msg){ return callback(msg); }
我正在为点云创建一个小型欧氏聚类节点,利用 PCL 的 KD 树实现。
目前,我的订户定义如下所示,
ClusteringNode::ClusteringNode(const rclcpp::NodeOptions &options)
: Node("clustering_node", options),
cloud_subscriber_{create_subscription<PointCloudMsg>(
"input_cloud", 10,
std::bind(&ClusteringNode::callback, this,
std::placeholders::_1))},
KD-tree 方法的定义在回调方法中并且运行良好,
现在为了进一步改进,我想在这里使用 lambdas 代替 std::bind 函数,
这里的方法应该是什么?
你可以替换
std::bind(&ClusteringNode::callback, this, std::placeholders::_1)
与
[this](auto&& var){ return callback(std::forward<decltype(var)>(var)); }
// or if no return value
[this](auto&& var){ callback(std::forward<decltype(var)>(var)); }
如果不需要支持完美转发,可以缩短为
[this](const auto& var){ return callback(var); }
// or if no return value
[this](const auto& var){ callback(var); }
这对我有用,
ClusteringNode::ClusteringNode(const rclcpp::NodeOptions &options)
: Node("clustering_node", options),
cloud_subscriber_{create_subscription<PointCloudMsg>(
"input_cloud", 10,
[this] (const PointCloudMsg::SharedPtr msg){
callback(msg);
})},
std::bind()
语句:
std::bind(&ClusteringNode::callback, this, std::placeholders::_1)
会翻译成这样的 lambda:
[this](const auto msg){ callback(msg); }
或者,如果 callback()
具有非 void
return 值:
[this](const auto msg){ return callback(msg); }