我意识到它等于语法糖,但随着lambda的出现,我本来希望能够输入
std::for_each(list, [](Emitter& e) { e->emit() });
而不是
std::for_each(list.begin(), list.end(), ....);
我得到的后者更普遍可用,但他们可以提供两者(AFAICT,前者只是另一个模板功能)
答案 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())
并获得你想要的行为。
由于您提出的版本只是语法糖,并且比作为库的一部分的版本(需要begin
和end
迭代器)更具限制性,因此添加它是没有意义的
我想你可以把这看作是“不要付出你不想要的东西”的延伸,这个哲学引导了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);
}
}