Ma question concerne le mélange de boost::variant
conversions avec std::vector
en C++. Dans mon projet, j'utilise des variantes comme sortie de SQL. Je n'utiliserai toujours qu'un seul type de variante. Ce que j'essaie de faire, c'est d'avoir une conversion facile de variant, vecteur de variant ou 2xvecteur de variant vers le type équivalent de mon choix. Naïvement, j'ai besoin de quelque chose de l'ordre de :
std::vector < int > my_variable = convert(some_variant_vector)
Tout d'abord, voici mon installation :
#include "boost\variant.hpp"
#include "boost\date_time\gregorian\gregorian.hpp"
typedef boost::variant< int, std::string, boost::gregorian::date> _var;
typedef std::vector<_var> _vec_var;
typedef std::vector<_vec_var> _vec2_var;
J'aimerais disposer d'un moyen simple pour convertir une _var
(ou _vec_var
ou _vec2_var
) en un int/string/date en fonction de mes besoins. A partir de ce qui suit poste Je sais que ma réponse devrait ressembler à quelque chose comme ça :
template<typename T>
struct converter_visitor : public boost::static_visitor<T>
{
const _var &converter;
converter_visitor(const _var &r) : converter(r) {}
T operator()(const _var &) const{
return boost::get<_var>(converter);
}
const _vec_var &v_converter; // case of vector<>
converter_visitor(const _vec_var &r) : v_converter(r) {}
T operator()(const _vec_var &) const{
T ans;
ans.reserve(_cont.size());
for (int i = 0; i < _cont.size(); ++i)
ans.push_back(boost::get<T>(v_converter[i]));
return ans;
}
const _vec2_var & v2_converter; // case of vector<vector>
converter_visitor(const _vec2_var &r) : v2_converter(r) {}
T operator()(const _vec2_var &) const {
T ans;
ans.reserve(v2_converter.size(), v2_converter[0].size());
for (int i = 0; i < _cont.size(); ++i)
{
for (size_t j = 0; j < v2_converter[0].size(); j++)
{
ans.push_back(boost::get<T>(v2_converter[i][j]));
}
}
return ans;
}
};
int main()
{
_var variable = 1;
int integer_conversion;
boost::apply_visitor(converter_visitor(test), integer_conversion);
return 0;
}
Malheureusement, je suis coincé depuis un certain temps avec ce problème car il ne fonctionne pas comme prévu et ne compile même pas.