J'ai cet extrait de test dans cet boost :: Any_cast code> donne une exception Bad_casting pour
std :: chaîne code>. Cela signifie pour une raison quelconque il n'est pas capable de taper
boost :: n'importe quel code> dans
std :: string code>. Tandis que d'autres classes comme
bitset code> 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? P> p>
3 Réponses :
in c ++ 11, Types discriminés contenant des valeurs de différents types, mais ne tentez pas la conversion entre eux, c'est-à-dire que Augmentation de "maykh" code> n'est pas un
std :: string code>, il s'agit d'un tableau
const code> de 7 caractères
{'m' , 'A', 'Y', 'U', 'K', 'H', '\ 0'} code>. En C ++ 14,
"maykh" s code> est un
std :: string code> après
à l'aide de namepace std :: littéraux :: string_literals; code>. < / p>
std :: string ("maykh") code> est un
std :: chaîne code> aussi. P>
boost :: Tout code> 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 : P>
5 code> est maintenu strictement sous forme d'int et n'est pas convertible implicitement à
"5" code > ou à
5.0 code>. 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. P>
blockQuote>
Tout code> 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 code> s: il convertit tous les types d'intégration signés en
intz_t code > et non signé à
uint64_t code>, il convertit
"bonjour" code> sur
std :: string ("bonjour") code>, etc.) avant de le stocker. < / p>
Ne serait-il pas plus correct de dire "un std :: chaîne code>"?
@Columbo Je suis avec vous à ce sujet, mais il y a ceux qui le prononcent comme string i>, auquel cas a i> est approprié.
@Columbo Ça commence par un S, fin de l'histoire. Les abréviations sont abréviations i> pas censées être prononcées (elles sont pas i> acronymes). Mais merci d'avoir expliqué comment les gens de la Terre montent avec cette énorme juxta-position de "un std :: t code>" i> parfois :)
@Columbo Comment prononcez-vous std :: string code> pour vous faire penser qu'il a besoin d'un
un code>?
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.
C'est parce que si vous voulez pouvoir utiliser < Code> Any_cast "maykh" code> n'est pas un
std :: string code>. C'est un
const char [7] code>, qui se décomposerait dans
const char * code>:
std :: string code>: p>
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); } }