J'ai une variante de boost de ressembler à ceci: J'ai besoin de pouvoir convertir toutes les valeurs de cette variante à une chaîne STD :: String, je me suis demandé s'il y a une fonction de type de modèle, je pourrais utiliser pour le faire? P>
ou quel serait le moyen le plus efficace? p>
Je voudrais actuellement mettre en œuvre un tas de fonctions surchargées, chacun prenant un type, puis effectuant la conversion en utilisant Typef Boost :: Variante
std :: stringstream code> ou pour
posix_time code> J'utiliserais sa conversion fonction. Peut-être qu'il y a une meilleure façon? P>
4 Réponses :
voir Convertir génériquement de boost :: variante boost :: lexical_cast code> pour tous vos types, à l'exception du
boost :: POSIX_Time :: pTONE code> où vous devez probablement faire une solution spéciale. Tout cela dans le
static_visitor code> à l'aide de la surcharge de l'opérateur (modèle + un pour la durée de PT). P>
Un moyen plus propre et plus élégant (mais pas plus efficace) de convertir un certain type en de p>
Le type à convertir doit fournir l'opérateur "<<" habituel pour OStream. P>
Exemple d'utilisation:
std :: string code> est d'utiliser p>
modèle
#include
std :: string s = boost :: lexical_cast
En fait, il peut également être plus efficace (boost doit utiliser un tableau de pile pour le tampon de flux si la longueur maximale de la représentation de chaîne d'un type est connue au moment de la compilation). Mais la question était sur boost :: variante code>.
Essayez ceci:
struct to_string_visitor : boost::static_visitor<> { std::string str; template <typename T> void operator()(T const& item) { str = boost::lexical_cast<std::string>(item); } void operator()(boost::posix_time::ptime const & item) { //special handling just for ptime } }; int main(){ variant v = 34; to_string_visitor vis; boost::apply_visitor(vis, v); cout << vis.str << endl; }
Ok, changé. Je n'ai pas compilé cela.
Joli! Utilisation puissante de surcharge.