Как некоторые библиотеки переопределяют оператор [] с несколькими типами возвращаемых данных? - PullRequest
0 голосов
/ 27 ноября 2018

В современном C ++ я сталкивался с различными библиотеками контейнеров, которые нашли способ переопределить operator[] и по-прежнему возвращать несколько типов.Например, используя nlohmann :: json , можно использовать следующий код:

const nlohmann::json settings;

// set some values:
j["pi"] = 3.141;
j["happy"] = true;

// get some values:
std::string deviceName = settings["device"];
bool yesOrNo = settings["blah"];

Как это возможно, особенно в случаях?В моих собственных попытках я столкнулся с распространенной ошибкой «не удалось вывести аргумент шаблона для« T »».Я думаю, что это связано с каким-то прокси-объектом (вероятно, value_t или object_t), однако я не смог достаточно глубоко следовать логике шаблона в случае реализации json от nlohmann (что довольно впечатляет!).

1 Ответ

0 голосов
/ 27 ноября 2018

Если вы посмотрите на объявление nlohmann::json::operator[], оно возвращает reference, которое определяется как value_type&, где value_type определяется как basic_json.Класс basic_json имеет оператор преобразования шаблонов, который может преобразовать значение json в любой тип, поддерживаемый методом basic_json::get(), который включает в себя логические значения, целые числа, строки и т. Д. Итак, по сути, вы делаете следующее:

//std::string deviceName = settings["device"];
std::string deviceName = settings["device"].operator std::string();
//which is effectively
//std::string deviceName = settings["device"].get<std::string>();

//bool yesOrNo = settings["blah"];
bool yesOrNo = settings["blah"].operator bool();
// which is effectively
//bool yesOrNo = settings["blah"].get<bool>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...