boost :: trim和std :: bind2nd

时间:2012-10-05 22:53:54

标签: c++

我正在尝试在字符串向量上使用boost::trim。我理解this solutions优雅,但我无法理解为什么

std::for_each(df.colnames.begin(), df.colnames.end(),
    std::bind2nd(std::ptr_fun(boost::trim<std::string>), std::locale()));

不起作用。我收到错误:

error: ‘typename _Operation::result_type std::binder2nd<_Operation>::operator()(typename _Operation::first_argument_type&) const [with _Operation = std::pointer_to_binary_function<std::basic_string<char>&, const std::locale&, void>; typename _Operation::result_type = void; typename _Operation::first_argument_type = std::basic_string<char>&]’ cannot be overloaded

为什么std::bind2nd在这里不起作用?

1 个答案:

答案 0 :(得分:1)

我认为这有两个问题:

  1. ptr_fun要求其参数返回一个值。看到: http://www.sgi.com/tech/stl/ptr_fun.html

  2. bind2nd不适用于引用参数。请参阅:Using std::bind2nd with references

  3. 故事的道德: boost::bind隐藏了令人震惊的复杂性。

    如果你真的想让它工作而不关心按值传递字符串/语言环境,你可以按如下方式包裹trim:

    int trim2(std::string s, const std::locale loc)
    {
      boost::trim<std::string>(s, loc);
      return 0;
    }
    

    然后做:

    std::for_each(df.colnames.begin(), df.colnames.end(),
        std::bind2nd(std::ptr_fun(trim2), std::locale()));
    

    P.S :( 1)可能与库有关。我只是尝试使用g ++,它没有出现void返回的问题。