Boost :: tuple эквивалентно элементу Python? - PullRequest
2 голосов
/ 24 августа 2009

У меня есть код, который выглядит следующим образом:

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: In instantiation of `boost::tuples::cons':
/path/to/boost/tuple/detail/tuple_basic.hpp:144:   instantiated from `boost::tuples::element >'
program.cc:33:   instantiated from here
/path/to/boost/tuple/detail/tuple_basic.hpp:329: error: `boost::tuples::cons::tail' has incomplete type
/path/to/boost/tuple/detail/tuple_basic.hpp:329: error: invalid use of template type parameter
/path/to/boost/tuple/detail/tuple_basic.hpp:151: confused by earlier errors, bailing out

В основном, чтобы использовать функцию Python operator.itemgetter, я хочу сделать что-то вроде этого:

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

Как я могу сделать это с помощью Boost?

1 Ответ

0 голосов
/ 24 августа 2009

Для этого вам нужно 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);

Обидно, что я не могу указать аргумент шаблона, поэтому я использовал вспомогательную функцию. Извините за это.

...