2 votes

Convertir std::any en un type inconnu

Si j'ai un std::any d'un std::string ou d'un int, comment pourrais-je le convertir en le type qu'il contient ?

std::any a un type dessus, cependant je ne peux pas utiliser ce type pour convertir.

Exemple :

#include 
#include 
#include 

int main(void) {
    std::any test = "choses";
    std::any test2 = 123;

    // Cela ne fonctionne pas
    std::string the_value = (std::string) test;
    int the_value2 = (int) test2;

    std::cout << the_value << std::endl;
    std::cout << the_value2 << std::endl;
}

9voto

John Smith Points 4542

Vous utilisez any_cast pour faire l'astuce. Par exemple

auto a = std::any(12); 
std::cout << std::any_cast(a) << '\n'; 

Vous pouvez trouver plus de détails sur cppreference

Si vous voulez caster dynamiquement la valeur à l'intérieur d'un std::any, vous pouvez essayer

if (a.type() == typeid(int)) {
    cout << std::any_cast(a) << endl;
} else if (a.type() == typeid(float)) {
    cout << std::any_cast(a) << endl;
}

6voto

Yakk Points 31636

Si vous n'avez pas une liste de types parmi lesquels le any en détient un, vous ne pouvez pas convertir le any en son type et y opérer comme sur son véritable type.

Vous pouvez stocker un type dans un any, et une opération dans ce type en tant que pointeur de fonction sur cet any. Mais cela doit être fait au moment du stockage ou lorsque vous avez une liste (éventuellement avec 1 élément) des types possibles stockés dans le any.

C++ ne stocke pas suffisamment d'informations dans un any pour permettre à un code arbitraire d'être compilé sur ce type lorsqu'il stocke la valeur dans le any. C++ ne permet pas une "réification" complète au moment de l'exécution.

Effacement de type par élimination du type `any` questions? Q&R par un utilisateur de stackoverflow de mauvaise réputation donne un exemple de comment se souvenir d'une opération sur le contenu du any tout en oubliant le type stocké.

Si vous avez une telle liste de types possibles, envisagez d'utiliser variant. any existe dans la fenêtre étroite où vous ne connaissez pas les types stockés au moment de la conception du conteneur, mais les connaissez à la fois à l'insertion et à la suppression.

Dans cette fenêtre étroite, vous pouvez effectuer des tests au moment de l'exécution en fonction de l'ID de type stocké et effectuer une conversion vers le type connu en utilisant any_cast.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X