是不是有理由将std :: for_each写成std :: list?

时间:2014-04-09 17:39:46

标签: c++ c++11

我意识到它等于语法糖,但随着lambda的出现,我本来希望能够输入

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

而不是

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

我得到的后者更普遍可用,但他们可以提供两者(AFAICT,前者只是另一个模板功能)

4 个答案:

答案 0 :(得分:3)

猜猜是什么?您可以! ;-)通过定义自己的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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

标准算法适用于范围,而不适用于容器。这是一个刻意的设计决定。标准库不应该膨胀。如果你想自己添加这个功能,你可以轻而易举地。

答案 3 :(得分:1)

由于我不参与Comittie,接下来是猜测。但对我来说似乎是合法的。

  

是不是有理由将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);
  }
}