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 に答える