Disons que j'ai unutilisant visiteur boost pour convertir les types
boost::variant<std::string, int> myVariant;
Dans cet objet, je conserver des données à partir d'une base de données, qui est entier ou texte habituellement, mais est parfois un temps stocké dans la base de données texte. Donc, je me demande si je peux créer un visiteur, que lors de la visite de l'objet variant avec une chaîne, retourne une structure de type 'tm'. Quelque chose comme ça:
class timeVisitor : public boost::static_visitor<boost::shared_ptr<tm> >
{
public:
boost::shared_ptr<tm> operator()(string &str) const
{
boost::shared_ptr<tm> dst(new tm());
strptime(str.c_str(), "%Y-%m-%d", dst.get());
return dst;
}
};
Ensuite, afin de l'utiliser:
boost::shared_ptr<tm> result = boost::apply_visitor(timeVisitor(), myVariant);
La chose est que je ne veux pas créer la struct tm dans le visiteur et mess avec quelques conseils partagés et d'autres choses. Je préfère donner un déjà créé au visiteur et à l'intérieur juste pour être initialisé. Quelque chose comme (dans le sens de l'utilisation):
tm result;
int returnCode = boost::apply_visitor(timeVisitor(result), myVariant);
Le visiteur vient initialiser avec strptime mon résultat struct tm et même revenir s'il y avait un problème avec la conversion en returnCode. Est-ce que quelqu'un sait comment cela peut être réalisé? Puis-je définir en quelque sorte le visiteur qui prend deux paramètres ... ou peut-être quelque chose d'autre?
Ouais! Celui-là fonctionnait parfaitement ... Je savais que j'avais besoin d'un petit coup de pouce, mais ces bibliothèques de boost sont parfois un peu déroutantes. Ce que je ne savais pas, c'est que puisque j'ai boost :: variant, alors je dois aussi définir operator() qui prend int comme paramètre! Et à partir des messages d'erreur n'est pas très facile à trouver :( –
pinpinokio