我在下面有这个代码。我需要更改它,以便我可以处理可能找不到字段的场景。我需要在那个场景中写零。最紧凑的方法是什么?我可以使用C ++ 14.对于从find_if
返回的迭代器,我似乎需要来自C#的FirstOrDefault运算符。然后我需要一个函数指针指向运行Convert的函数或返回0f的函数指针。我不清楚如何在C ++中做到这一点。 (我来自C#land;我对这个或那个函数在C ++中的方法不太好。)
auto xField = *std::find_if(msg->fields.begin(), msg->fields.end(),
[](const sensor_msgs::msg::PointField& f){ return f.name == "x"; });
auto yField = *std::find_if(msg->fields.begin(), msg->fields.end(),
[](const sensor_msgs::msg::PointField& f){ return f.name == "y"; });
auto zField = *std::find_if(msg->fields.begin(), msg->fields.end(),
[](const sensor_msgs::msg::PointField& f){ return f.name == "z"; });
// TODO: fill with 0f for any missing fields (and don't crash if they're missing)
for(auto p = 0; p < msg->data.size(); p += msg->point_step) {
auto x = ConvertToFloat(xField, &msg->data[p + xField.offset]);
auto y = ConvertToFloat(yField, &msg->data[p + yField.offset]);
auto z = ConvertToFloat(zField, &msg->data[p + zField.offset]);
point_cloud.emplace_back(x, y, z);
}
答案 0 :(得分:2)
这种情况的通常模式是编写一个基本上执行的包装函数:
auto iter = std::find_if(collection.begin(), collection.end(), ...);
if (iter == collection.end() {
return default_value;
}
return *iter;
您可以将该内容模板化为您心中的内容。但我现在要保持简单。如果事实证明它是几种不同类型所需的标准模式,您可以随后将其设为模板。