Bonjour à tous,
J'ai découvert il y a peu les variants de boost et j'ai défini le type suivant :J'utilisais ce type comme par exemple avec une map de type
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef boost::make_recursive_variant<bool, int, size_t, std::string, time_t, unsigned int, unsigned long long, std::map<std::string, boost::recursive_variant_>, std::vector<std::string>>::type Value;et où j'accède aux données de la façon suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::map<std::string, Value>Sauf que par la suite, je me suis rendu compte qu'en plus d'un vector de string, j'ai besoin d'un vector de map<std::string, std::string>. J'ai essayé de modifier mon type comme suit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 for (const auto &data : datas) { if (data.second.type() == typeid(bool)) root[data.first] = boost::get<bool>(data.second); else if (data.second.type() == typeid(int)) root[data.first] = boost::get<int>(data.second); else if (data.second.type() == typeid(size_t)) root[data.first] = static_cast<uint64_t>(boost::get<size_t>(data.second)); else if (data.second.type() == typeid(std::string)) root[data.first] = boost::get<std::string>(data.second); else if (data.second.type() == typeid(time_t)) root[data.first] = static_cast<int64_t>(boost::get<time_t>(data.second)); else if (data.second.type() == typeid(unsigned int)) root[data.first] = boost::get<unsigned int>(data.second); else if (data.second.type() == typeid(unsigned long long)) root[data.first] = boost::get<uint64_t>(data.second); else if (data.second.type() == typeid(std::map<std::string, Value>)) root[data.first] = this->convertDataToJson(boost::get<std::map<std::string, Value>>(data.second)); else if (data.second.type() == typeid(std::vector<std::string>)) root[data.first] = this->convertDataToJson(boost::get<std::vector<std::string>>(data.second)); else { Utils::log(Logger::LEVEL::WARN, "Type not found for key [%s]", data.first.c_str()); }mais quand je tente d'utiliser mon type Value, j'ai une erreur...
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef boost::make_recursive_variant<bool, int, size_t, std::string, time_t, unsigned int, unsigned long long, std::map<std::string, boost::recursive_variant_>, std::vector<boost::recursive_variant_>>::type Value;
Je m'explique...
1) J'ai une classe Dto où j'ai 3 méthodes pour ajouter des data
2) J'ai une classe EventPlayDoneDto qui hérite de ma classe Dto où je souhaite ajouter une vecteur de strings
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Dto { /* Attributs */ ... std::map<std::string, Value> _data; /* Methods */ public: ... /* Setters */ void setData(const std::map<std::string, std::string> &data); void setData(const std::pair<std::string, Value> &data); void setData(const std::string &key, const Value &value);
Au moment de compiler, j'obtiens l'erreur suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class EventPlayDoneDto : public Dto { /* Methods */ public: ... void setPlayedFiles(const std::vector<std::string> &files); }; //---------------------------------- void EventPlayDoneDto::setPlayedFiles(const std::vector<std::string> &files) //---------------------------------- { this->setData("files", files); }
Je ne vois pas ce que j'ai raté...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 eventplaydonedto.cpp: In member function void EventPlayDoneDto::setPlayedFiles(const std::vector<std::basic_string<char> >&): eventplaydonedto.cpp:49:30: error: no matching function for call to EventPlayDoneDto::setData(const char [6], const std::vector<std::basic_string<char> >&) this->setData("files", files);
Est-ce que mon nouveau type Value vous semble correct? et qu'est ce que j'ai pu faire de travers?
Partager