我正在尝试在 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;
我还设法定义了一个 tuple_type,它是 boost::tuple 的特化,具有与 data_frame 相同的签名。
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> &'
显然 zip 正在复制 std:vector 元素the_vectors
而不是传递引用,因此push_back
失败了。
有谁知道我如何让 fusion zip 传递参考而不是副本?