我有同事偶尔使用typedef来避免打字.例如:
typedef std::list<Foobar> FoobarList;
...
FoobarList GetFoobars();
Run Code Online (Sandbox Code Playgroud)
就个人而言,我总是讨厌遇到这样的代码,很大程度上是因为它迫使我去查找typedef所以我可以告诉如何使用它.我也觉得这种事情是一个潜在的滑坡...如果你这样做,为什么你不这样做呢?(很快,你的代码完全被混淆了).我在这个问题上发现了这个问题:
我有两个问题:1)我真的一个人不喜欢这个吗?2)如果绝大多数人认为这种typedef使用正常,你用什么标准来确定是否键入一个类型?
Ecl*_*pse 18
这种类型的两个主要论点typedef是减少了你已经提到过的打字,以及转换到新型容器的难易程度.FoobarList可以由a vector或a list或a 支持,deque并且切换通常只需要更改typedef.
在处理IDE时,你不喜欢它们,因为我只能将鼠标悬停在类型名称上,IDE会告诉我它的定义是什么.
有嵌套容器时更有用的情况 - 您可以给名称赋予一些语义含义,而无需定义整个类:
typedef std::list<Foobar> FoobarList;
typedef std::map <string, FoobarList> GizmosToFoobarsMap;
Run Code Online (Sandbox Code Playgroud)
在处理这些类型的迭代器时,您还可以保存大量的类型(尽管现在C++ 0x已经减少了auto.)
typedefs对于STL和模板编程通常是必不可少的.只需看看迭代器特征的工作原理:
template <class Iterator>
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
template <class T>
struct iterator_traits<T*> {
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};
Run Code Online (Sandbox Code Playgroud)
至于typedefs的"快捷方式"用法- 我认为在本地化的实现文件中完全没问题.我在这里有相同的规则using namespace- 如果它可以节省我打字并且不会混淆他人,那就去吧.
我喜欢这样的typedef,因为它们提高了可读性.考虑到std::vector<std::string>::const_iterator所有地方,甚至是std::map<std::string, std::vector<std::string> >::iterator.一半的代码最终只是描述类型,而一堆typedef简化了很多.我不认为理解它也是一个障碍太多 - 如果你将鼠标悬停在它上面或定义上,IDE通常可以告诉你类型,并且使用代码通常需要你理解这样的事情.
我喜欢它,typedef因为它允许稍后更改容器的类型(比如,分析显示std::deque更快std::list)而不更改所有相关代码.
如果你想知道:我不反对被称为列表的东西,即使它可能是一个std::deque.在这种情况下,我将"列表"视为概念术语,而不是数据结构.(你不把你的购物清单当成双链表,是吗?)
| 归档时间: |
|
| 查看次数: |
5171 次 |
| 最近记录: |