typedef的用例

时间:2018-04-20 18:07:33

标签: c++ frameworks typedef

在机器人框架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

3 个答案:

答案 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有许多类似点的类型PointPoint32Vector3Quaternion等都有这些typedef,有些是double,有些是float 。假设我们想创建一个可以使用类似点类型的模板Triangle类:

template<typename T>
class Triangle {
    public:
      T vertex_1;
      T vertex_2;
      T vertex_3;
};

现在假设您要编写一个返回三角形高度的成员函数。请记住,ROS早于autodecltypeusing别名,但您可以使用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数据。