编写std::for_each不是为了获取std::list,这是有原因的吗

Is there a reason std::for_each was not written to take a std::list?

本文关键字:std list for each 编写 获取      更新时间:2023-10-16

我意识到这相当于语法糖,但随着lambda的出现,我希望能够键入

std::for_each(list, [](Emitter& e) { e->emit() });

而不是

std::for_each(list.begin(), list.end(), ....);

我知道后者更通用,但它们可以同时提供(AFAICT前者只是另一个模板函数)

你猜怎么着?你可以!;-)通过定义自己的for_each函数:

template <class C, class F>
F for_each(C const& c, F f) {
    return std::for_each(std::begin(c), std::end(c), f);
}

你可以在这里看到一个活生生的例子:http://ideone.com/gwGNGL

随着lambdas的出现,也出现了基于范围的for循环:

for (auto &e: list)
    e.emit();

标准算法适用于范围,而不是容器。这是一个深思熟虑的设计决定。标准库不应过于庞大。如果你想自己添加这个功能,你可以简单地添加。

由于我不在Comitie上,下面是猜测。但对我来说似乎是合法的。

std::for_each不是为了获取std::list而编写的吗?

代码膨胀

同时提供for_each (begin, end)for_each (container)实际上是多余的。毕竟,正如您所说,您可以简单地编写for_each (c.begin(), c.end())并获得您想要的行为。

由于您提出的版本只是语法糖,而且比库中的版本(采用beginend迭代器)更具限制性,因此添加它毫无意义

我想你可以把这看作是"不要为你不想要的东西买单"哲学的延伸,这一哲学指导了C++的大部分总体设计。如前所述,您可以非常简单地提供自己的相当通用的函数。以下是一些psudocde示例:

namespace blah
{
  template <typename Cont, typename UnaryFunction> inline UnaryFunction for_each (Cont& cont, UnaryFunction f)
  {
    return std::for_each (cont.begin(), cont.end(), f);
  }
}