检查对象是否为String的最有效方法

时间:2016-11-15 08:18:41

标签: c++ string performance types ros

我得到一个数字或字符串的对象(msg.data)。如果它是一个字符串我不想使用它,如果它是我想要的数字。我目前用ostringstream解决了这个问题,但我认为有更好的解决方案:

void scan_cb(const sensor_msgs::LaserScan::ConstPtr& scan)
{
float dist = 0.0f;

std::ostringstream s;
s << scan->ranges[0]; // can be string (always "inf") or a float
if(s.str() != "inf"){
    dist += scan->ranges[0];
}
...

我关心效率,因为这是每秒运行多次的for循环的一部分。

基本结构是来自某个主题的ROS消息,基本上可以包含任何数据类型。 在这种情况下,我使用的是LaserScan message,文档中未提及range[x]可以返回“inf”

1 个答案:

答案 0 :(得分:3)

根据ROS文档,scan->ranges是一个浮点数组。这是有道理的,因为当dist字符串表示不是ranges[0]时,您将其添加到浮点数(inf)。

这意味着(正如MSalters在评论中猜到的那样),你有一个真正的浮点值,你只想确保它是一个实数,既不是无限值也不是NaN(非数字)值。 / p>

因此,如果您包含cmath(或math.h),您可以使用C分类宏来确定数字是否有限(但允许使用次正规值)或正常(甚至拒绝次正常值) :

void scan_cb(const sensor_msgs::LaserScan::ConstPtr& scan)
{
float dist = 0.0f;

if(isfinite(scan->ranges[0])){
    dist += scan->ranges[0];
}
...

(关于wikipedia上浮点数的IEEE-754表示的更多参考资料)