让我说我有:
set<int, less<int> > m_intset;
这样可行,但现在我将其更改为typedef
,最后我会得到两行代码:
typedef set<int, less<int> > SetInt;
SetInt m_intset;
这种typedef
有什么好处?我正确使用它吗?
答案 0 :(得分:18)
使用 typedef 的一些优点:
简化:现在,每当您通常需要set<int, less<int> >
时,您只需输入SetInt
即可。如果你只使用一次这个集合没什么大不了的,但是如果你有同一个集合的多个实例,或者需要访问它的迭代器,那么更短的形式更容易阅读和输入。
澄清:set<int, less<int> >
并没有告诉我有关该变量的用途,只是它是一组整数。使用 typedef ,您可以选择一个解释该类型用途的标识符,例如Inventory
或Coordinates
。
抽象:程序发生变化。虽然您可能认为现在需要set<int, less<int> >
,但您的要求可能会在将来发生变化,这需要set<unsigned long, less<unsigned long> >
或vector<int>
或其他一些变更。通过使用 typedef ,您只需要在一个地方修复它,它将影响程序中SetInt
的每个实例。与手动更改源文件中的十几个或更多条目相比,这更简单,更不容易出错。
由于上面的第2点和第3点, typedef 在类或库中使用时可以非常强大,因为它可以加强接口和实现之间的分离,这通常被认为是很好的C ++形式。
当然,如果你在同一个程序中多次使用相同的类型,这些优点中的大多数只能真正显示出来。如果您只希望使用set<int, less<int> >
一次,则 typedef 可能有点过分。
答案 1 :(得分:5)
Typedef主要是符号方便,但它们确实有很多好处:
我确信还有更多我没想到......
答案 2 :(得分:4)
你完全正确。使用typedef可以更轻松地使用SetInt::iterator
等内容。
答案 3 :(得分:3)
当您多次引用相同类型时,好处是。例如,如果要迭代您的集合;比较:
for (set<int, less<int> >::iterator i = xs.begin(); i != xs.end(); ++i)
使用:
for (IntSet::iterator i = xs.begin(); i != xs.end(); ++i)
如果您有嵌套模板参数(例如set
pair
vector
string
},则差异会更明显。
答案 4 :(得分:2)
您正在为要在特定上下文中使用的类型创建别名。这个例子怎么样:
typedef int INT32
这一切都很好,如果你只编译了int是32位数量的环境,你根本不需要它。但是,也许在将来的某一天,您将代码移植到本机int为64位的系统中。现在你的代码可能会有一些错误,如果它假定int的32位大小在任何地方使用它们。使用typedef,您只需要更改参数:
typedef /*some 32 bit type*/ INT32
请注意,这只是一个例子。如果将来可能发生变化或者清除代码,那么这个想法就会抽象出类型。