在机器人框架ROS(www.ros.org)中有一些使用typedef定义其成员变量的条款,我真的找不到这个原因。例如:
class Point : public ros::Msg
{
public:
typedef double _x_type;
_x_type x;
typedef double _y_type;
_y_type y;
typedef double _z_type;
_z_type z;
Point():
x(0),
y(0),
z(0)
{
}
}
有没有人对此有任何线索?定义类Point的原因是什么,而不仅仅是这样:
class Point : public ros::Msg
{
public:
double x;
double y;
double z;
Point():
x(0),
y(0),
z(0)
{
}
}
这个类的整个实现可以在这里找到:
https://mirror.umd.edu/roswiki/doc/diamondback/api/geometry_msgs/html/Point_8h_source.html
答案 0 :(得分:1)
做这种事情的想法是可维护性。
如果有一天他们认为双重确定不行,但真正需要的是@if ($errors->any())
<div class="alert alert-danger mt-3">
<ul>
@foreach ($errors->all() as $error)
<li class="text-danger">{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
可能是也可能不是一个班级,改变和改变它是微不足道的。如果人们避免假设它是双重的(例如通过super_extra_accurate_double
而不是memcpy(sizeof(double))
(当然,memcpy是一个不好的例子,但它会为这个答案做的事情) );然后他们可以改变类型,不需要重新编写代码来处理新的大小。
答案 1 :(得分:0)
这样您就可以轻松编写可以在多个Point
类型上运行的通用(模板化)代码。只要Point
类型具有这些typedef,您就可以轻松地声明与相应成员变量具有相同类型的变量。
ROS有许多类似点的类型Point
,Point32
,Vector3
,Quaternion
等都有这些typedef,有些是double,有些是float 。假设我们想创建一个可以使用类似点类型的模板Triangle
类:
template<typename T>
class Triangle {
public:
T vertex_1;
T vertex_2;
T vertex_3;
};
现在假设您要编写一个返回三角形高度的成员函数。请记住,ROS早于auto
,decltype
或using
别名,但您可以使用typdefs:
typename T::_z_type height() const {
typename T::_z_type min_z = std::min(std::min(vertex_1.z, vertex_2.z), vertex_3.z);
typename T::_z_type max_z = std::max(std::min(vertex_1.z, vertex_2.z), vertex_3.z);
return max_z - min_z;
}
答案 2 :(得分:-3)
以后可以帮助开发人员避免逻辑错误。
帮助他们不要在x或y上进行任何数学运算。
此功能也可以写成明确的x或y数据。