C++ 如果通过解析字符串定义一个结构体

wisefree · 2024-2-8 20:22:54 · 340 次点击
``` C++
"
struct demo
{
        uint32_t x;
    double y;
    int arr[3];
}
"
```

请问大家,假设有这样的一个字符串,C++有没有现成的库,可以方便地把字符串转成结构体定义呢?
举报· 340 次点击
登录 注册 站外分享
20 条回复  
star9029 小成 2024-2-8 20:30:14
没理解问题。。是想要反序列化?目前 cpp 没有官方反射,序列化之类的操作都没有完美的方法实现
venicejack 小成 2024-2-8 20:30:27
用 protobuf 处理,code gen 成你想要的代码,c++是编译型语言,一切类型都需要在编译时确定下来
iOCZS 小成 2024-2-8 20:39:10
没什么意义,你又用不到它的静态特性,只考虑动态特性,那不就是一个多字段的值的集合么。
424778940 小成 2024-2-8 21:40:31
考虑 protobuf 或者 json 库吧 但这些也都是要预定义结构的
动态定义的基本没有, 但如果熟悉内存操作也不是不能作死弄一套, 但还是要预定义一套规范/协议才行
Cu635 小成 2024-2-8 21:47:01
输入的字符串就是结构体语法再加上个双引号?双引号的格式是全都是例子这样的么?
如果是的话,看看能不能采用读入字符串-->去掉双引号-->去掉双引号的字符串输出/保存成文件-->用保存的文件再进行后续操作的思路。当然,具体实现可能要考虑各种情况。
terryching 小成 2024-2-8 22:02:38
看看 GPT4 给出的答案:
运行时解析:使用已有的数据结构,如 std::map 或自定义的数据结构,来在运行时模拟结构体。基于解析得到的信息(字段名、类型、数组大小等),你可以动态地存储和访问数据。这种方法牺牲了类型安全和编译时优化,但提供了灵活性。
```c++
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <typeinfo>
#include <cstdint>

class DynamicStruct {
public:
    std::map<std::string, std::vector<uint8_t>> fields;

    void addInt(const std::string& name, int value) {
        auto data = reinterpret_cast<uint8_t*>(&value);
        fields[name] = std::vector<uint8_t>(data, data + sizeof(value));
    }

    void addDouble(const std::string& name, double value) {
        auto data = reinterpret_cast<uint8_t*>(&value);
        fields[name] = std::vector<uint8_t>(data, data + sizeof(value));
    }

    int getInt(const std::string& name) {
        if(fields.find(name) != fields.end()) {
            auto& data = fields[name];
            return *reinterpret_cast<const int*>(data.data());
        }
        return 0; // Or throw an exception
    }

    double getDouble(const std::string& name) {
        if(fields.find(name) != fields.end()) {
            auto& data = fields[name];
            return *reinterpret_cast<const double*>(data.data());
        }
        return 0.0; // Or throw an exception
    }

    // Similar methods can be added for other types and arrays
};

int main() {
    DynamicStruct myStruct;
    myStruct.addInt("x", 123);
    myStruct.addDouble("y", 456.789);
    // For arrays, you might add them element by element or as a block if you know the size

    std::cout << "x = " << myStruct.getInt("x") << std::endl;
    std::cout << "y = " << myStruct.getDouble("y") << std::endl;

    // Accessing array elements would require additional methods

    return 0;
}
```
neocanable 小成 2024-2-8 22:09:26
提供个思路,如果这个活要我干,我就把 lua 搞进去,如果不让把 lua 搞进去。我就用 json 了。
churchill 小成 2024-2-8 22:11:33
不明来源的二进制文件,即使能动态定义结构体,比如内嵌一个 TinyC 之类的东西,可是还有内存对齐呢,还是走协议的路子吧
beyondstars 小成 2024-2-8 22:34:25
我觉得你可能需要的是 C++ 模板元编程 (TMP), TMP 允许你做图灵完备的编译期计算。这本是是教程: https://www.amazon.com/C-Templates-Complete-Guide-2nd/dp/0321714121
123下一页
返回顶部