Use*_*erX 1 c++ json types type-conversion auto
我们如何创建一个可以为 auto 变量分配不同类型的 C++ 函数?
\nnlohmann json 包执行此操作,这证明它\xe2\x80\x99s 是可能的:
\n#include <iostream>\n#include "./x64/Debug/single_include/nlohmann/json.hpp"\nusing namespace std;\n\nusing json = nlohmann::json;\n\nint main()\n{\n nlohmann::json obj = nlohmann::json::parse("{ \\"one\\": \\"111\\", \\"two\\": 222}");\n\n string res1 = obj["one"]; // Types defined:\n int res2 = obj["two"];\n\n auto a1 = obj["one"]; // Auto variables:\n auto a2 = obj["two"];\n\n cout << "Types defined: " << res1 << ' ' << res2 << endl;\n cout << "Auto variables: " << a1 << ' ' << a2 << endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\nTypes defined: 111 222\nAuto variables: "111" 222\n
Run Code Online (Sandbox Code Playgroud)\n自动变量正确接收类型 string 和 int。
\n我有一个类存储不同类型,我想将它们分配给自动变量,就像 nlohmann json 那样。
\n我\xe2\x80\x99已经尝试使用隐式转换方法。下面的基类定义了 int() 和 string() 转换,这些转换在 int 和 string 的派生类中被重写。因此PayloadParamBase被转换为int或string以匹配派生类。问题是,当 PayloadParamBase 分配给自动变量时,我无法将 \xe2\x80\x99t 转换为正确的类型。请参阅下面的结果。
\n#include <iostream>\n#include <unordered_map>\nusing namespace std;\n\nclass PayloadParamBase;\nunordered_map<string, PayloadParamBase*> map;\n\nclass PayloadParamBase // Base class.\n{\npublic:\n virtual void operator= (const int i) { };\n virtual void operator= (const string s) { };\n\n virtual operator int() const { return 0; }; // Implicit conversions:\n virtual operator string() const { return ""; };\n \n PayloadParamBase& operator[](const char* key) { string tmp(key); return operator[](tmp); } // Avoids implicit conversion error.\n PayloadParamBase& operator[](const string& key); \n};\n\nPayloadParamBase& PayloadParamBase::operator[] (const string& key)\n{\n PayloadParamBase* ptr = map[key]; // Look up a derived class.\n return *ptr;\n}\n\nclass PayloadStringParam : public PayloadParamBase // String derived class.\n{\npublic:\n PayloadStringParam(string st) { mValue = st; }\n virtual operator string() const override { return mValue; }\nprotected:\n string mValue;\n};\n\nclass PayloadIntParam : public PayloadParamBase // Int derived class.\n{\npublic:\n PayloadIntParam(int i) { mValue = i; }\n virtual operator int() const override { return mValue; }\nprotected:\n int mValue;\n};\n\nint main()\n{\n map["one"] = new PayloadStringParam("111");\n map["two"] = new PayloadIntParam(222);\n\n PayloadParamBase pl;\n\n string strVal = pl["one"]; // Assignment to fixed type works:\n int intVal = pl["two"];\n cout << "Types defined: " << strVal << ' ' << intVal << endl;\n\n auto res1 = pl["one"]; // Assignment to autos doesn't use type:\n auto res2 = pl["two"];\n cout << "Auto variables: " << res1 << ' ' << res2 << endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\nTypes defined: 111 222\nAuto variables: 0 0\n
Run Code Online (Sandbox Code Playgroud)\n自动变量为零并且赋值失败。分配给自动变量时如何转换为正确的类型?谢谢!
\nC++ 的一个基本属性是所有对象的类型都在编译时定义并已知。这是 C++ 的基础,没有解决方法或例外。
auto a1 = obj["one"]; // Auto variables:
auto a2 = obj["two"];
Types defined: 111 222
Auto variables: "111" 222
Run Code Online (Sandbox Code Playgroud)
自动变量正确接收类型 string 和 int。
不,他们没有。如果您深入研究该库的头文件,您会发现nlohmann::json
's[]
运算符返回特定类型的对象......
cout << "Auto variables: " << a1 << ' ' << a2 << endl;
Run Code Online (Sandbox Code Playgroud)
...并且此对象实现了一个<<
重载,该重载根据底层 JSON 文件中的对象是字符串、数值还是其他内容来格式化对象的内容。
对您来说,一个非常简单、琐碎的学习体验是使用调试器在此处设置断点,并让调试器向您显示a1
和a2
对象的类型。你会发现它们是完全相同的类型。它们不是字符串类型或整数类型。它们是此 JSON 库中定义的类,表示 JSON 文件中指定的不透明值。这基本上是一个std::variant
.
归档时间: |
|
查看次数: |
192 次 |
最近记录: |