我对于是否以及何时应该在C ++中使用typedef感到有些困惑。我觉得这是可读性和清晰度之间的平衡。
这是一个没有任何typedef的代码示例:
int sum(std::vector<int>::const_iterator first,
std::vector<int>::const_iterator last)
{
static std::map<std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator>,
int> lookup_table;
std::map<std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator>, int>::iterator lookup_it =
lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
IMO很丑。因此,我将在函数内添加一些typedef以使其看起来更好:
int sum(std::vector<int>::const_iterator first,
std::vector<int>::const_iterator last)
{
typedef std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator> Lookup_key;
typedef std::map<Lookup_key, int> Lookup_table;
static Lookup_table lookup_table;
Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
代码仍然有些笨拙,但是我摆脱了大多数噩梦般的内容。但是仍然有int向量迭代器,此变体摆脱了这些迭代器:
typedef std::vector<int>::const_iterator Input_iterator;
int sum(Input_iterator first, Input_iterator last)
{
typedef std::tuple<Input_iterator, Input_iterator> Lookup_key;
typedef std::map<Lookup_key, int> Lookup_table;
static Lookup_table lookup_table;
Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
这看起来很干净,但是仍然可读吗?
什么时候应该使用typedef?我一旦做恶梦类型?一旦发生不止一次?我应该放在哪里?我应该在函数签名中使用它们还是将它们保留在实现中?
1
不是重复的,而是与我的问题有关的程序员
—
。stackexchange.com/
typedef Input_iterator std::vector<int>::const_iterator;
是倒退
可读性和清晰度之间有区别吗?
—
2012年
当
—
托马斯·爱丁
#define
不够好。