Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ typedef的用例_C++_Frameworks_Typedef - Fatal编程技术网

C++ typedef的用例

C++ typedef的用例,c++,frameworks,typedef,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;

在机器人框架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)
    {
    }
}
这个类的整个实现可以在这里找到:


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

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


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

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

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


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

这样,您就可以轻松编写通用(模板化)代码,可以在多个
类型上操作。只要
类型具有这些typedef,您就可以轻松地声明与相应成员变量类型相同的变量

ROS有许多类似点的类型,
point
Point32
Vector3
Quaternion
,等等,它们都有这些类型定义,有些是双精度的,有些是浮点型的。假设我们要创建一个模板化的
三角形
类,该类可以使用任何类似点的类型:

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

这样,您就可以轻松编写通用(模板化)代码,可以对多个
类型进行操作。只要
类型具有这些typedef,您就可以轻松地声明与相应成员变量类型相同的变量

ROS有许多类似点的类型,
point
Point32
Vector3
Quaternion
,等等,它们都有这些类型定义,有些是双精度的,有些是浮点型的。假设我们要创建一个模板化的
三角形
类,该类可以使用任何类似点的类型:

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

这样做的想法是可维护性


如果有一天他们认为double不合适,但真正需要的是
super\u extra\u precision\u double
,它可能是一个类,也可能不是一个类,那么改变是微不足道的,如果人们避免假设它是一个double(例如通过执行
memcpy(sizeof(double))
而不是
memcpy(sizeof(要点::_x_type))
(当然,memcpy是一个坏例子,但对于这个答案就可以了);然后他们可以更改类型,不需要重新编写代码来处理新的大小。

这样做的想法是可维护性



如果有一天他们认为double不合适,但真正需要的是
super\u extra\u precision\u double
,它可能是一个类,也可能不是一个类,那么改变是微不足道的,如果人们避免假设它是一个double(例如通过执行
memcpy(sizeof(double))
而不是
memcpy(sizeof(要点::_x_type))
(当然,memcpy是一个很糟糕的例子,但对于这个答案它就可以了);然后他们可以更改类型,无需重新编写代码来处理新的大小。

以前,您无法推断类型,必须依赖名称。注意还有一种
Point32
类型具有相同的typedef,但它们是
float
。您自己阅读了这些源代码吗?它们使用
双精度索引我猜它允许按类型识别轴。这可能允许简化某些几何计算。最可能使用的是一些需要根据名称确定成员类型的宏。过去有一段时间,您无法推断类型,必须依赖名称注:还有一个
点32
类型除了它们是
float
,它们的类型都相同。你自己读过这些源代码吗?它们使用
double
索引。我猜它允许按类型识别轴。这可能会简化某些几何计算。很可能使用了一些宏,需要根据其na确定成员类型me.Typedef不会阻止你做数学运算。@Slava如果你的意思是,如果你犯了错误,编译器不会抱怨,我同意。那么
Typedef
如何帮助你不对它们做数学运算呢?当你调试旧代码时,遇到这样的代码:x_TypeA=5;y_TypeB=5;res=a*b;,编译器会接受呃。但是由于你定义了不同的typedef,你知道你在做一些函数上错误的事情。我也不明白这对避免错误或编写函数有什么帮助。typedef不会阻止你做数学运算。@Slava如果你的意思是如果你犯了错误,编译器不会抱怨,我同意。那怎么办de>帮助您不对它们进行数学运算?当您调试旧代码时,遇到以下代码:x_TypeA=5;y_TypeB=5;res=a*b;将被编译器接受。但由于您定义了不同的typedef,您知道您在做一些功能上错误的事情。我也不明白这将如何帮助避免错误或者写函数。你能开发吗?使用T.x和T.y的模板代码应该可以完成这项工作,即使没有typedef@sandwood使用typedef,您可以在模板中使用类型
ClassName::x_type
,而不管它是什么。ROS比
decltype
@sandwood早,我添加了一个(稍微做作的)你能开发吗?使用T.x和T.y的模板代码应该可以完成这项工作,即使没有typedef@sandwood使用typedef,您可以在模板中使用类型
ClassName::\u x_type
,而不管它是什么。ROS比
decltype
@sandwood早。我添加了一个(稍微做作的)示例。