【问题标题】:boost::trim each string in std::vector<std::string>boost::trim 中的每个字符串 std::vector<std::string>
【发布时间】:2011-01-14 09:02:31
【问题描述】:

我目前一直在寻找修剪 std::vector 中每个字符串的正确语法。

我试过了

std::vector<std::string> v;
std::for_each(v.begin(), v.end(), &boost::trim);

这在 MSVC7.1 中给了我以下错误消息。

错误 C2784:“_Fn1 std::for_each(_InIt,_InIt,_Fn1)”:无法使用 [_Ty=std:: 从“std::vector<_ty>::iterator”推导出“T1”的模板参数string] : 见 'std::for_each' 的声明

错误 C2896: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : 不能使用函数模板 'void boost::algorithm::trim(SequenceT &,const std::locale &)' 作为函数参数: 见'boost::algorithm::trim'的声明

如果我显式地给模板参数 trims 第二个参数,编译器是找不到的,虽然它是默认设置的。

std::for_each(v.begin(), v.end(), &boost::trim<std::string>);

错误 C2198: 'void (__cdecl *)(std::string &,const std::locale &)' : 通过函数指针调用的参数太少

我想知道为v 中的每个元素调用 trim 的正确语法是什么样的。

【问题讨论】:

  • 还要注意for_each 不用于修改原始序列。请改用transform
  • 错了,for_each 非常适合他的工作。请记住 boost::trim 返回 void,这意味着它不能与 transform 一起使用。
  • 难道就没有针对这种情况的 boost::trim_copy 吗?
  • 是的,除了首先没有情况:OP 对 for_each 的使用很好。请参阅此相关主题:stackoverflow.com/questions/662845/…
  • @Diego:反过来。 transform 旨在是不可变的,这就是为什么它需要一个目标迭代器。

标签: c++ stl boost foreach


【解决方案1】:

还需要绑定 trim 的第二个参数(语言环境):

std::vector<std::string> v;
std::for_each(v.begin(), v.end(), 
              boost::bind(&boost::trim<std::string>,
                          _1, std::locale() ));

【讨论】:

  • 谢谢。我也考虑过 bind ,但我认为我不能轻易地在那里添加第二个参数。你帮了很多忙。
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
相关资源
最近更新 更多