问题描述
我正在用 C++ 实现一个协议,这是一个正在进行的项目,因此协议经常更改,我必须相应地更改代码。
假设我按如下方式定义消息:
struct Message {
const int MSG_LENGTH = 3; // sizeof(a) + sizeof(b)
uint8_t a;
uint16_t b;
};
现在我想在 uint32_t c
中添加一个新字段 Message
,但我不想手动更改 MSG_LENGTH
。
是否可以使用一些技巧(宏或模板)来实现这一点?
谢谢。
解决方法
一种想法可能是以 std::tuple
的形式定义消息:
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <tuple>
template<class... Types>
struct MessageBase : std::tuple<Types...> {
static constexpr size_t MSG_LENGTH() {
return (sizeof(Types) + ...); // calc the size of the fields
}
};
struct Message : MessageBase<uint8_t,uint16_t> {};
int main() {
constexpr auto x = Message::MSG_LENGTH();
std::cout << x << '\n'; // prints 3
}