9
votes

Boost :: Variante à STD :: String

J'ai une variante de boost de ressembler à ceci: Typef Boost :: Variante Variante;

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?

ou quel serait le moyen le plus efficace?

Je voudrais actuellement mettre en œuvre un tas de fonctions surchargées, chacun prenant un type, puis effectuant la conversion en utilisant std :: stringstream ou pour posix_time J'utiliserais sa conversion fonction. Peut-être qu'il y a une meilleure façon?


0 commentaires

4 Réponses :



1
votes

voir Convertir génériquement de boost :: variante à taper . Vous devriez être capable d'adapter cette réponse à votre situation. Vous pouvez utiliser boost :: lexical_cast pour tous vos types, à l'exception du boost :: POSIX_Time :: pTONE où vous devez probablement faire une solution spéciale. Tout cela dans le static_visitor à l'aide de la surcharge de l'opérateur (modèle + un pour la durée de PT).


0 commentaires

0
votes

Un moyen plus propre et plus élégant (mais pas plus efficace) de convertir un certain type en std :: string est d'utiliser

modèle cible lexical_cast (const source et arg);

de

#include

Le type à convertir doit fournir l'opérateur "<<" habituel pour OStream.

Exemple d'utilisation: std :: string s = boost :: lexical_cast (17); affirmer (S == "17");


1 commentaires

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 .



4
votes

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


2 commentaires

Ok, changé. Je n'ai pas compilé cela.


Joli! Utilisation puissante de surcharge.