我有一个char
(即字节)缓冲区,我通过网络发送。在将来的某个时刻,我可能希望将缓冲区切换为其他类型,例如unsigned char
或short
。我一直在考虑做这样的事情:
typedef char bufferElementType;
每当我使用缓冲区元素执行任何操作时,我都将其声明为bufferElementType
而不是char
。这样我可以通过改变这个typedef切换到另一种类型(当然它不会那么简单,但它至少很容易识别需要修改的地方......会有{{1附近)。
这是typedef的有效/好用吗?难道不值得吗?这会在将来的某个时候让我头疼吗?会不会让维护程序员讨厌我?
我已阅读When Should I Use Typedef In C++,但没有人真正涵盖这一点。
答案 0 :(得分:11)
这是一个很好的(和正常的)用法。但是,您必须小心,例如,您选择的类型符合相同的有符号/无符号条件,或者它们对运算符的响应类似。然后,之后更改类型会更容易。
另一种选择是使用模板来避免修改类型直到您编译的那一刻。一个定义为:
的类template <typename CharType>
class Whatever
{
CharType aChar;
...
};
能够使用您选择的任何字符类型,同时它以相同的方式响应所有运算符。
答案 1 :(得分:2)
typedef的另一个优点是,如果明智地使用它们,它们可以提高可读性。作为一个非常愚蠢的例子,米和学位都可以是双打,但你想区分它们。使用typedef是快速的&amp;轻松解决make errors more visible。
注意:上述示例的更强大的解决方案是为仪表和度数创建不同的类型。因此,编译器可以自己实施。然而,这需要一些工作,但这并不总能带来回报。使用typedef是一个快速的&amp;如上文链接的文章所述,轻松实现错误可见的方法。
答案 2 :(得分:1)
是的,这是typedef的完美用法,至少在C中。
对于C ++,可能会认为模板是一个更好的主意(正如Diego Sevilla所建议的那样),但它们有它们的缺点。 (如果使用数据类型的所有内容尚未包含在几个类中,编译时间较慢且源文件结构更复杂等,则额外工作。)
将两种方法结合起来也是有意义的,即为模板参数提供typedef名称。
请注意,当您通过网络发送数据时,char和其他整数类型可能无法互换(例如,由于endian-ness)。在这种情况下,使用具有专门函数的模板化类可能更有意义。 (发送&lt; char&gt;发送字节,发送&lt; short&gt;首先将其转换为网络字节顺序)
另一种解决方案是使用辅助方法(convertToNetworkOrderBytes())创建一个“BufferElementType”类,但我敢打赌这对你来说太过分了。