3

次の行に沿って、C++ (S++/R など) で「データ フレーム」型クラスを実装しようとしています。

template<typename T1, typename T2, typename T3>
class data_frame;

ここでの私の目標は、質問とはあまり関係のない理由から、データを (単純なタプルのベクトルとしてではなく) 「列ベクトル」としてメモリに格納することです。

(可変個引数のテンプレートがなく、固定数のパラメーターについて今は心配していないと仮定します。これは後で回避できます)。

MPL と融合を使用して、これまで std:vectors の融合シーケンスを作成できました。

template <typename T> 
struct make_vector 
{ 
    typedef std::vector<T> type; 
}; 
typedef boost::mpl::vector<T1, T2, T3> data_types;
typedef boost::mpl::transform1<data_types, make_vector<_1> >  vector_types;
typedef boost::fusion::result_of::as_vector<vector_types>::type vectors;

また、data_frame と同じ署名を持つ boost::tuple の特殊化である tuple_type を定義することもできました。

typedef details_not_shown tuple_type;

ここで、tuple_type を data_frame に追加できるメンバー関数を定義したいと思います。これが私が考えていることです:

vectors the_vectors;

struct append
{
    typedef void result_type;

    template<typename U>
    void operator()(const U & d, std::vector<U> & v) const
    {
        v.push_back(d);
    }
}

void push_back(tuple_type & t)
{
    fusion::for_each(fusion::zip(t,the_vectors), fusion::make_fused_function_object(append())) ;
}

これを (VS2010 C++ で) コンパイルすると、次のエラーが発生します。

error C2664: 'void some_class<T0,T1,T2>::append::operator ()<const T>(const U &,std::vector<_Ty> &) const'
: cannot convert parameter 2 from 'const std::vector<_Ty>' to 'std::vector<_Ty> &'

the_vectorsどうやら、zip は参照を渡すのではなくstd:vector 要素のコピーを作成しているため、push_back失敗します。

Fusion zip にコピーではなく参照を渡す方法を知っている人はいますか?

4

0 に答える 0