【发布时间】:2019-08-16 10:40:07
【问题描述】:
tl;dr:有没有办法从 typename 派生枚举值?
详情: 我正在尝试模板化一个函数以在每个结构数据之前发送一个标题。标头存储在枚举类中,例如:
enum class TypeHeader {
Test1 = 4;
Test2 = 16;
Test3 = 50;
};
我有许多带有字段和类型的结构。 示例结构:
struct Test1 {
uint32_t field1;
uint32_t field2;
}
struct Test2 {
uint8_t field1;
uint8_t field2;
}
struct Test3 {
uint8_t field1;
uint16_t field2;
}
结构的名称与枚举字段相同(不一定,我认为这可能会使事情变得更容易)
向服务器发送数据的函数:
template<typename T>
void send(const uint8_t* const s) {
uint8_t data[2 + sizeof(T)];
// data[1] = TypeHeader::???? << 8
// data[0] = TypeHeader::????
// i want data[0] and data[1] to have the struct id
// as a uint16 which is in the enum TypeHeader
memcpy(data + 2, s, sizeof(T));
// then data is ready and I can send it...
}
我知道我可以向模板或函数添加额外的参数并传递 TypeHeader 值,但我想知道编译器是否有办法将类型名链接到 enum 标记,所以我可以这样做:
Test1 test1;
send(test1);
【问题讨论】:
-
您仍然可以将结构保留为 POD 类型,同时仍然添加可以调用以返回
TypeHeader值的静态成员函数。不过重载可能会更好(然后它将调用一个新的私有send函数,该函数将类型和TypeHeader作为参数)。 -
您应该只为特定类型重载
send函数。