Вы не можете создать std :: vector для InternalColumn, если они не имеют одинаковый тип T, поэтому, я думаю, вы хотели создать векторы слияния.Вместо этого я использовал std :: tuple, который очень похож.Решение ниже работает, пока типы InternalColumn различны (потому что я использую тип как ключ для std :: get).Чтобы обобщить его, можно создать std :: index_sequence и получить доступ к кортежу по индексу
#include <tuple>
template <typename Type, typename Handler>
struct InternalColumn
{
InternalColumn(Type& data, Handler h): data_(data), h_(h) {}
// overloaded functions for data binding ( int, char, long..)
template<typename SourceData>
void bindData(SourceData src){}
Type& data_; // pointer to external data
Handler h_; // for some reasons
};
template<typename Lambda, typename Tuple, int ID=0>
void for_each_tuple(Lambda&& l, Tuple& t){
l(std::get<ID>(t));
if constexpr(ID < std::tuple_size<Tuple>::value-1)
for_each_tuple<Lambda, Tuple, ID+1>(l, t);
}
template <template <typename ...> class Tuple, typename Handler, typename ... Types>
int writeDataFunc(Tuple<Types ...>&& cols, Handler h)
{
Tuple<InternalColumn<Types, Handler> ...> vt{InternalColumn{std::get<Types>(cols), h} ...};
for_each_tuple(h, vt);
}
// i also have stuff like this:
template<typename T, typename H>
auto makeColumn(T* data, H h)
{
return InternalColumn<T, H>(data, h);
}
main()
{
int i= 0;
char c[32] = {0};
long l = 0;
writeDataFunc(std::make_tuple(i,c,l), [&](auto& col)
{
// working with i, c, l variables
});
}