模板专业化取决于类型
Template specialization depending on type
我尝试使用一些模板元编程根据类型和其他值计算常量。
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++ (GNU Tools for ARM Embedded Processors (Arduino build)) 4.8.3 20140228 (release) [ARM/embedded-4_8-branch revision 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 功能,一切都会正常进行。但是我不知道如何专注于类型名而不是位数。如何做到这一点?
使 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 upper_bound = 60 * number_of_bits * 10;
};
(部分)专业化应该是这样的:
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<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
我尝试使用一些模板元编程根据类型和其他值计算常量。
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++ (GNU Tools for ARM Embedded Processors (Arduino build)) 4.8.3 20140228 (release) [ARM/embedded-4_8-branch revision 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 功能,一切都会正常进行。但是我不知道如何专注于类型名而不是位数。如何做到这一点?
使 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 upper_bound = 60 * number_of_bits * 10;
};
(部分)专业化应该是这样的:
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<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