std::for_each 需要一个一元函数(或至少具有一元函数的 typedef 的东西)。
std::reverse<> 是一个二元函数。它需要两个迭代器。可以使用 boost::bind 将它们绑定在一起,但这将是一个非常可怕的混乱。就像是:
boost::bind(
&std::reverse<std::string::iterator>,
boost::bind(&std::string::begin, _1),
boost::bind(&std::string::end, _1))
我认为更好的是编写一个名为 reverse_range 的可重用函数,如下所示:
template <class Range>
void reverse_range(Range& range)
{
std::reverse(range.begin(), range.end());
}
(可能通过一些元编程来确保 Range& 不是双重引用)
然后在你的 for_each 中使用它(当然,在将它调整为一元函数之后)。
std::for_each(v.begin(), v.end(),
std::ptr_fun(&reverse_range<std::string>));
编辑:
因为 string::begin 和 string::end 都有 const 和 non-const 变体,所以有必要强制转换它们(正如 litb 在我写它们以测试我的答案时发现的那样...... +1!)。这使它非常冗长。Typedefs 可以使它更卫生一点,但要坚持单线主题:
boost::bind(
&std::reverse<std::string::iterator>,
boost::bind(
(std::string::iterator (std::string::*)())&std::string::begin, _1),
boost::bind(
(std::string::iterator (std::string::*)())&std::string::end, _1)
)
);
这只是尖叫重构。
最后,因为无聊,给 C++0x 加分:
std::for_each(v.begin(), v.end() [](std::string& s){ std::reverse(s); });
编辑: boost::bind 工作得很好,不需要 boost::lambda。