J'ai une signature de fonction, qui prend un vector<specific_type>
comme argument et appelle une autre fonction qui a vector<boost::variant<specific_type, ...>>
comme argument. Un simple transfert de l'argument ne fonctionne pas. J'ai trouvé que le remballage était la seule solution, mais ce n'est probablement pas la solution la plus performante. Est-ce qu'un simple casting est possible?C++, cast un vecteur <type_spécifique> en vecteur <boost :: variant>
exemple minimal:
#include "boost/variant.hpp"
#include <string>
#include <vector>
typedef boost::variant<int, std::string> test_t;
void inner(std::vector<test_t> a) {}
void outer(std::vector<int> a) {
// the following does not work:
//inner(a);
//inner((std::vector<test_t>) a);
//inner(const_cast<std::vector<test_t>>(a));
//inner(reinterpret_cast<std::vector<test_t>>(a));
//inner(static_cast<std::vector<test_t>>(a));
//inner(dynamic_cast<std::vector<test_t>>(a));
// only "valid" solution
std::vector<test_t> b;
for (const int i : a) {
b.push_back(i);
}
inner(b);
}
int main()
{
std::vector<int> a = { 1, 4, 2 };
outer(a);
}
Cela évite l'allocation de mémoire supplémentaire, mais itère également le vecteur complet? La syntaxe est plutôt sympa, bien sûr. – gerion
@gerion Pas moyen de contourner cela. Vous devez construire une 'variant' pour chaque élément - ne peut pas le faire sans regarder tous les éléments. – Barry
@gerion, pouvez-vous au moins déplacer les objets vers le vecteur variant? –