我尝试通过一些模板元编程来根据类型和其他值来计算常量。
template <typename t, uint8_t number_of_bits> struct bin_size {};
template <>
struct bin_size<uint8_t, uint8_t number_of_bits> {
const uint8_t upper_bound = 255;
};
template <>
struct bin_size<int32_t, uint8_t number_of_bits> {
const uint8_t upper_bound = 60 * number_of_bits * 10;
};
但是,编译器(arm-none-eabi-g++(用于ARM嵌入式处理器的GNU工具(Arduino构建))4.8.3 20140228(发行版)[ARM / embedded-4_8-branch版本208322]
)抱怨以下错误。
test.cpp:287:52: error: template argument 2 is invalid
struct bin_size<uint8_t, uint8_t number_of_bits> {
^
test.cpp:292:52: error: template argument 2 is invalid
struct bin_size<int32_t, uint8_t number_of_bits> {
^
Error compiling.
没有number_of_bits功能,一切都会按预期进行。但是我无法弄清楚如何专门处理类型名而不是位数。如何才能做到这一点?
最佳答案
只需添加一个期望数字的模板参数,然后在您的特化中使用其名称即可:
template <uint8_t number_of_bits>
struct bin_size<uint8_t, number_of_bits> {
const uint8_t upper_bound = 255;
};
template <uint8_t number_of_bits>
struct bin_size<int32_t, number_of_bits> {
const uint8_t upper_bound = 60 * number_of_bits * 10; // You forgot "_t" here.
};
这样,特化是部分的,仍然取决于某些内容(在您的情况下为
number_of_bits
)这是一个示例:https://ideone.com/fvTa0O
关于c++ - 模板特化取决于类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28837309/