我有一个可以处理 2 种不同协议(protocol)的通信类。协议(protocol)由枚举模板变量选择。 现在,2 个协议(protocol)中的一个仅支持 2 字节值,而另一个支持 4 字节值。 通信是通过模板成员函数完成的。如何更改 static_assert 使其占用 2 或 4 个字节,具体取决于类特化(= 选择的协议(protocol))?
#include <iostream>
#include <math.h>
enum Protocol { P1, P2 };
template <Protocol P>
class Communicator {
public:
template <typename T>
void communicate(T arg) {
static_assert(sizeof(arg) <= sizeof(float), "argument size must be <= 4 bytes");
float value = (float)arg;
uint8_t length = sizeof(arg); //length in bytes
_communicate(value, length);
}
void _communicate(float f, uint8_t length) {
std::cout << f;
}
};
编辑:我只能选择 1 个答案是正确的。尽管我从 Roy 那里学到了最多,但我还是选择了 MM 的答案,因为它使事情尽可能简单。 (虽然都赞成)
最佳答案
有几种方法可以解决这个问题……这里是一种方法:
template<Protocol P>
size_t value_size();
template<> size_t value_size<P1>() { return 2; }
template<> size_t value_size<P2>() { return 4; }
// ... inside your other function
static_assert(sizeof(arg) <= value_size<P>(),
关于c++ - 根据模板枚举参数更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167587/