boost make_recursive_variant et recursive_variant_
Bonjour à tous,
J'ai découvert il y a peu les variants de boost et j'ai défini le type suivant :
Code:
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;
J'utilisais ce type comme par exemple avec une map de type
Code:
std::map<std::string, Value>
et où j'accède aux données de la façon suivante
Code:
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());
} |
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:
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;
mais quand je tente d'utiliser mon type Value, j'ai une erreur...
Je m'explique...
1) J'ai une classe Dto où j'ai 3 méthodes pour ajouter des data
Code:
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); |
2) J'ai une classe EventPlayDoneDto qui hérite de ma classe Dto où je souhaite ajouter une vecteur de strings
Code:
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);
} |
Au moment de compiler, j'obtiens l'erreur suivante
Code:
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); |
Je ne vois pas ce que j'ai raté...
Est-ce que mon nouveau type Value vous semble correct? et qu'est ce que j'ai pu faire de travers?