代码之家  ›  专栏  ›  技术社区  ›  Linux Geek

typedef的用例

  •  2
  • Linux Geek  · 技术社区  · 7 年前

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

    有人对此有任何线索吗?为什么要这样定义类点而不是简单地这样定义:

    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 回复  |  直到 7 年前
        1
  •  1
  •   UKMonkey    7 年前

    这样做的想法是可维护性。

    如果有一天他们决定双倍不好,但真正需要的是 super_extra_accurate_double 它可能是一个类,也可能不是一个类,如果人们避免假设它是一个双精度的(例如 memcpy(sizeof(double)) 而不是 memcpy(sizeof(Point::_x_type)) (当然,memcpy是一个很坏的例子,但它可以解决这个问题);然后他们可以更改类型,无需重新编写代码来处理新的大小。

        2
  •  0
  •   Chris Drew    7 年前

    这样您就可以轻松地编写可以在多个 Point 类型只要 指向 type有这些typedef,您可以轻松地使用与相应成员变量相同的类型声明变量。

    ROS有许多类似点的类型 指向 ,则, 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;
    }
    
        3
  •  -3
  •   Luc    7 年前

    它可以帮助开发人员避免以后在逻辑上出现错误。

    帮助他们不要一起对x或y进行任何数学运算。

    此外,该函数还可以编写为显式需要x或y数据。