繁体   English   中英

模板专业化取决于类型

[英]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 ++(用于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功能,一切都会正常进行。 但是我不知道如何专门处理类型名而不是位数。 如何才能做到这一点?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM