Я создаю небольшой узел евклидовой кластеризации для облака точек, используя реализацию дерева KD в PCL.

В настоящее время мое определение подписчика выглядит так:

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 находится внутри метода обратного вызова и работает отлично,

Теперь, чтобы улучшить его, я хочу использовать здесь лямбды вместо функции std :: bind,

Какой здесь должен быть подход?

1
pandarulez 14 Окт 2021 в 21:48

3 ответа

Лучший ответ

Заявление std::bind():

std::bind(&ClusteringNode::callback, this, std::placeholders::_1)

Переведется в лямбду так:

[this](const auto msg){ callback(msg); }

Или, если callback() имеет не - void возвращаемое значение:

[this](const auto msg){ return callback(msg); }
2
Remy Lebeau 14 Окт 2021 в 19:04

Вы можете заменить

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); }
2
NathanOliver 14 Окт 2021 в 19:10

Это сработало для меня,

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);
        })},
0
pandarulez 14 Окт 2021 в 19:03