我在现代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"];
Run Code Online (Sandbox Code Playgroud)
这怎么可能,特别是在案例中呢?在我自己的尝试中,我遇到了"无法推断'T'的模板参数"的常见错误情况.我确实认为它与一些代理对象(可能value_t或者object_t)有关,但是在nlohmann的json实现的情况下,我无法完全遵循模板逻辑(这非常令人印象深刻!).
如果查看声明nlohmann::json::operator[],则返回a reference,定义为a 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>();
Run Code Online (Sandbox Code Playgroud)