Plus tôt, j'ai demandé ce question environ std::variant
. Considérant que les types détenus par la variante sont tous imprimables par std::cout
, existe-t-il un moyen simple de mettre en œuvre un visiteur?Un modèle pourrait-il fonctionner pour la visite de std :: variant?
Here par exemple, tout en bas, vous avez plusieurs lambdas pour couvrir chaque type, mais tous font la même chose (sauf std::string
): std::cout << arg << ' ';
. Y a-t-il un moyen de ne pas me répéter?
std::visit(overloaded {
[](int arg) { std::cout << arg; },
[](long arg) { std::cout << arg; },
[](double arg) { std::cout << arg; }
// I removed the std::string case
}, v); // v is the std::variant
et écrire à la place:
std::visit( [](auto arg) { std::cout << arg; }, v);
ou quelque chose comme:
template<typename T>
void printer(T arg) {std::cout << arg; }
//.......
std::visit(printer, v);
Le deuxième bloc (avec le lambda générique) devrait fonctionner. Le troisième bloc (avec la fonction de modèle) ne fonctionnera pas parce que le modèle n'est pas une fonction ou un objet unique. Vous pouvez écrire votre propre callable avec un template 'operator()': 'struct printer {template void opérateur() (T arg) {std :: cout << arg; }}; std :: visit (printer {}, v); '(qui est à peu près équivalent au lambda générique). –
Lorsque nous continuons à ajouter la balise [tag: C++] à vos questions, il y a une raison. S'il vous plaît faites-le vous-même à partir de maintenant. –