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);
}
}