gpt4 book ai didi

c++ - 通用类型转换

转载 作者:行者123 更新时间:2023-11-28 01:19:26 25 4
gpt4 key购买 nike

我正在使用 C++14(不能使用比这更高的版本)。

我有 3 个结构:

struct TypeA {                    
Header header;
struct data {
std::uint32_t d;
};
};

struct TypeB {
Header header;
struct data {
std::uint32_t d;
std::uint16_t a;
};
};

struct TypeC {
Header header;
struct data {
std::uint32_t d:20;
std::uint32_t a:12;
};
};

我还有一个字符串,它基本上是从流中接收到的数据。解析头部(第一个 60 字节)后,我知道字符串的其余部分包含什么类型的数据(无论是 TypeA、TypeB 还是 TypeC)。最终我应该能够做类似的事情:

//header.type = 1, 2 or 3
data_type = get_data_type(header.type);
data_type data = static_cast<data_type>((char*)str.c_str());;

如何在不使用太多 if-else 语句的情况下以通用方式执行此操作?

最佳答案

要没有 if 语句,您需要工厂函数的查找表(或 switch 语句)。根据您希望它有多“好”,您可以在运行时初始化表,或者让编译器使用一些静态初始化魔法为您生成它。

运行时版本类似于:

using prefix_t = decltype(Header.type);
using myvar_t = std::variant<StructA, StructB, StructC>;
using factory_t = std::function<myvar_t(body_buffer_t)>;
std::map<prefix_t, factory_t> factories;

// this can be improved with static initialization so factories would register themselves
factories[HeaderOfStructA] = ...;
factories[HeaderOfStructB] = ...;
factories[HeaderOfStructC] = ...;

关于c++ - 通用类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57216917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com