увеличить вектор слияния различных std :: vectors для реализации фрейма данных

Я пытаюсь реализовать класс типа «фрейм данных» в 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 передавать ссылку, а не копию?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]