7
votes

Comment booster :: Any_cast dans STD :: String

J'ai cet extrait de test xxx

dans cet boost :: Any_cast donne une exception Bad_casting pour std :: chaîne . Cela signifie pour une raison quelconque il n'est pas capable de taper boost :: n'importe quel dans std :: string . Tandis que d'autres classes comme bitset ou mon propre classe définie par l'utilisateur fonctionnent. Pouvez-vous s'il vous plaît dites-moi pourquoi et en dehors de cela?


0 commentaires

3 Réponses :


14
votes

"maykh" n'est pas un std :: string , il s'agit d'un tableau const de 7 caractères {'m' , 'A', 'Y', 'U', 'K', 'H', '\ 0'} . En C ++ 14, "maykh" s est un std :: string après à l'aide de namepace std :: littéraux :: string_literals; . < / p>

in c ++ 11, std :: string ("maykh") est un std :: chaîne aussi.

boost :: Tout ne prend en charge que la conversion vers le même type (bien, jusqu'à une décharge / const / etc.). Il ne prend pas en charge les conversions entre les types. Voir Boost Toute documentation :

Types discriminés contenant des valeurs de différents types, mais ne tentez pas la conversion entre eux, c'est-à-dire que 5 est maintenu strictement sous forme d'int et n'est pas convertible implicitement à "5" ou à 5.0 . Leur indifférence à l'interprétation, mais la prise de conscience du type les rend efficacement sûr des conteneurs génériques de valeurs simples, sans possibilité de surprises de conversions ambiguës.

Augmentation de Tout avec des conversions supplémentaires intelligentes peut être effectuée. Par exemple, un pseudo-tout qui prend un type entrant et éventuellement la convertit automatiquement (de sorte qu'il ne convertit pas court s: il convertit tous les types d'intégration signés en intz_t et non signé à uint64_t , il convertit "bonjour" sur std :: string ("bonjour") , etc.) avant de le stocker. < / p>


6 commentaires

Ne serait-il pas plus correct de dire "un std :: chaîne "?


@Columbo Je suis avec vous à ce sujet, mais il y a ceux qui le prononcent comme string , auquel cas a est approprié.


@Columbo Ça commence par un S, fin de l'histoire. Les abréviations sont abréviations pas censées être prononcées (elles sont pas acronymes). Mais merci d'avoir expliqué comment les gens de la Terre montent avec cette énorme juxta-position de "un std :: t " parfois :)


@Columbo Comment prononcez-vous std :: string pour vous faire penser qu'il a besoin d'un un ?


Il est définitivement prononcé String String. Cela devrait être dans la norme. Sous [Basic.Plavement].


@Yakk Eh bien, je le prononce "S-T-D String" ...: D Mais oui, si dans votre esprit, il est prononcé "se tenait" puis "A" est définitivement le bon article à utiliser.



6
votes

C'est parce que "maykh" n'est pas un std :: string . C'est un const char [7] , qui se décomposerait dans const char * : xxx

si vous voulez pouvoir utiliser < Code> Any_cast , vous auriez besoin de le mettre en tant que std :: string : xxx


0 commentaires

3
votes

Ce n'est pas une réponse à l'organe de la question, mais plutôt au titre d'aider les autres qui viennent également ici de Google:

bool is_char_ptr(const boost::any & operand)
{
    try {
        boost::any_cast<char *>(operand);
        return true;
    }
    catch (const boost::bad_any_cast &) {
        return false;
    }
}

std::string any2string(boost::any anything)
{
    if (anything.type() == typeid(int)) {
        return std::to_string( boost::any_cast<int>(anything) );
    }
    if (anything.type() == typeid(double)) {
        return std::to_string(boost::any_cast<double>(anything));
    }
    if (is_char_ptr(anything)) {
        return std::string(boost::any_cast<char *>(anything));
    }
    if (boost::any_cast<std::string>(anything)) {
        return boost::any_cast<std::string>(anything);
    }

}


0 commentaires