最有效的检查对象是否是字符串的方法

Most efficient way to check if object is a String

本文关键字:字符串 方法 是否是 检查 有效 对象      更新时间:2023-10-16

我得到一个对象(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消息,文档中没有提到range[x]可以返回"inf"

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

这意味着(正如MSalters在其注释中猜测的那样),你有一个真正的浮点值,你只是想确保它是一个实数,既不是无穷大的值,也不是NaN(非数字)值。

因此,如果您包含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];
}
...

(维基百科关于IEEE-754浮点数表示的更多参考)