一些库如何用多个返回类型覆盖operator []?

时间:2018-11-26 22:27:00

标签: c++ templates

我遇到了现代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_tobject_t)有关,但是在nlohmann的json实现(即非常令人印象深刻!)。

1 个答案:

答案 0 :(得分:6)

如果查看nlohmann::json::operator[]的声明,它将返回一个reference,它定义为value_type&,其中value_type被定义为basic_jsonbasic_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>();