在我看来,真正的问题是你是否经常这样做,是否值得在一个地方编写额外的代码来清理其他地方的代码。
我可以想象写一个deref_iterator
可以让你做这样的事情:
std::vector<T> vector_of_objects{
deref_iterator(std::begin(vector_of_pointers)),
deref_iterator(std::end(vector_of_pointers))};
现在,我们剩下的问题是这是否真的比原始循环短。就简单的击键次数而言,它可能取决于你给事物起的名字。如果您不关心可读的名称,它可能是:
vector<T> v_o{d(begin(v_p)), d(end(v_p))};
短名称显然使它变短,但我当然不会建议他们——如果我不只是输入这个,我根本不知道它的含义。更长的名称(需要重复几次)显然会增加更多的击键,但我无法想象有人认为可读性不值得。
无论如何,它deref_iterator
本身显然会占用一些代码。一个迭代器有足够的样板代码,它通常需要大约 100 行代码左右。让我们(有点武断地)决定每次使用它时都会节省一行代码。在此基础上,您必须使用它 100 次才能收支平衡。
我不确定这是否准确地描述了整个代码的特征——迭代器的代码大部分是样板代码,除了一个错字之外,它并没有太多可能真正出错的地方。在大多数情况下,只需包含正确的标头并使用它,而实际上不必查看迭代器本身的代码。
既然如此,即使代码总行数增加,我也可能会接受它作为一种改进。写它只使用一次显然是一种损失,但我认为它也不需要整整 100 次才能达到收支平衡。