检查对象是否为字符串的最有效方法
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)
我得到一个对象 (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)