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

Most efficient way to check if object is a String

我得到一个对象 (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]可以return"inf".

根据ROS文档,scan->ranges是一个float数组。这是有道理的,因为当 ranges[0] 字符串表示形式 不是 inf.[=18= 时,您将它添加到浮点数 (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 表示的更多参考 wikipedia