Я пытаюсь реализовать класс типа «фрейм данных» в C ++ (как в S + / R), что-то вроде:
template<typename T1, typename T2, typename T3>
class data_frame;
Моя цель здесь состоит в том, чтобы хранить данные в памяти как «векторы столбцов» (а не как простой вектор кортежей) по причинам, которые на самом деле не имеют отношения к данному вопросу.
(предположим, у меня нет шаблонов с переменным числом аргументов, и что меня сейчас не беспокоит фиксированное количество параметров — я могу обойти это позже).
Используя MPL и fusion, я до сих пор смог создать последовательность слияния 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 передавать ссылку, а не копию?
Задача ещё не решена.
Других решений пока нет …