【发布时间】:2017-11-07 21:17:31
【问题描述】:
我有一个可以处理 2 种不同协议的通信类。协议由枚举模板变量选择。 现在 2 个协议中的 1 个仅支持 2 字节值,而另一个支持 4 字节值。 通信是通过模板成员函数完成的。如何更改 static_assert 使其占用 2 或 4 个字节,具体取决于类专业化(= 选择的协议)?
#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 的答案,因为它使事情尽可能简单。 (虽然都赞成)
【问题讨论】:
-
如果只是将最终的双精度或(长)长整数向下转换为浮点数,为什么还要使用模板?也许最好只接受一个浮点数并让最终的编译器警告告诉调用者在使用该类时他的精度会发生什么,如果需要的话。
-
@MichaelRoy 该库适用于 Arduino 用户。我怀疑他们会查看编译器警告(默认情况下禁用)。但是你有一个非常有效的观点!我会研究程序的设计。
-
((P == P1) ? 2 : 4)可能也可以 -
@M.M 真的就这么简单吗? (因为你说“可能”)
-
MM有一个非常有效的观点。
标签: c++ templates enums template-specialization