C++ typedef的用例
在机器人框架ROS(www.ROS.org)中,有一些类别使用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;
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早。我添加了一个(稍微做作的)示例。