我们如何创建一个可以为 auto 变量分配不同类型的 C++ 函数?

Use*_*erX 1 c++ json types type-conversion auto

我们如何创建一个可以为 auto 变量分配不同类型的 C++ 函数?

\n

nlohmann 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

结果:

\n
Types 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

结果:

\n
Types defined: 111 222\nAuto variables: 0 0\n
Run Code Online (Sandbox Code Playgroud)\n

自动变量为零并且赋值失败。分配给自动变量时如何转换为正确的类型?谢谢!

\n

Sam*_*hik 5

C++ 的一个基本属性是所有对象的类型都在编译时定义并已知。这是 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 文件中的对象是字符串、数值还是其他内容来格式化对象的内容。

对您来说,一个非常简单、琐碎的学习体验是使用调试器在此处设置断点,并让调试器向您显示a1a2对象的类型。你会发现它们是完全相同的类型。它们不是字符串类型或整数类型。它们是此 JSON 库中定义的类,表示 JSON 文件中指定的不透明值。这基本上是一个std::variant.