我遇到了现代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
)有关,但是在nlohmann的json实现(即非常令人印象深刻!)。
答案 0 :(得分:6)
如果查看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>();