2

我有一些看起来像这样的代码:

typedef tuple<int, int, double> DataPoint;
vector<DataPoint> data;
vector<double> third_column_only;
// Code to read in data goes here.
transform(data.begin(), data.end(), back_inserter(values), tuples::get<1, DataPoint>);

不幸的是,最后一行没有编译 - 它给了我这样的消息:

/path/to/boost/tuple/detail/tuple_basic.hpp:在 `boost::tuples::cons' 的实例化中:
/path/to/boost/tuple/detail/tuple_basic.hpp:144:从 `boost::tuples::element >' 实例化
program.cc:33:从这里实例化
/path/to/boost/tuple/detail/tuple_basic.hpp:329:错误:`boost::tuples::cons::tail' 类型不完整
/path/to/boost/tuple/detail/tuple_basic.hpp:329:错误:模板类型参数的使用无效
/path/to/boost/tuple/detail/tuple_basic.hpp:151:被早期的错误弄糊涂了

基本上,要使用 Python 的 operator.itemgetter 函数,我想做这样的事情:

transform(data.begin(), data.end(), back_inserter(values), itemgetter(2))  

如何使用 Boost 做到这一点?

4

1 回答 1

0

你需要一个boost::bind来做到这一点。

double get2(boost::tuple<int,int,double> const& v ) {
    return boost::get<2>(v) ;
}

int main () {
    using namespace std ;
    using namespace boost ;
    typedef tuple<int, int, double> DataPoint;
    vector<DataPoint> data;
    vector<double> third_column_only;
    // Code to read in data goes here.
    transform(data.begin(), data.end(), back_inserter(values), bind(get2, _1);
}

实际上,该get2函数也是不必要的,但我们必须为boost::get函数指定确切的模板参数,可能像:

transform(data.begin(), data.end(), back_inserter(values), 
          bind(get<2, int, tuple<int, double> >, _1);

很遗憾我没有如何指定模板参数,所以我使用了一个辅助函数。对于那个很抱歉。

于 2009-08-24T04:59:17.653 回答