在编译时使用 constexpr 填充类内 C 样式数组

问题描述 投票:0回答:0

我有一个类使用看起来像这样的表格方法来计算 CRC(它是不完整的):

template<typename CrcBaseType, uint32_t Polynomial, uint32_t InitialValue, uint32_t XorOut, bool ReverseInput, bool ReverseOutput>
requires std::unsigned_integral<CrcBaseType>
class CrcDriver{
public:
    CrcDriver() {};
private:
    const CrcBaseType table[256];
    const uint8_t size = sizeof(CrcBaseType);
private:
    constexpr void genTable() {
        for (uint32_t divident = 0; divident < 256; divident++) {
            uint32_t curByte = divident << (8 * (size - 1));
            for (uint8_t bit = 0; bit < 8; bit++) {
                if ((curByte & (0x80 << (8 * (size - 1)))) != 0)
                {
                    curByte <<= 1;
                    curByte ^= Polynomial;
                }
                else
                {
                    curByte <<= 1;
                }
            }
            table[divident] = curByte & (0xFFFFFFFF >> (4 - size) * 8);
        }
    }

    constexpr void genTableR() {
        Polynomial = ReverseWord(Polynomial) >> (4 - size) * 8;
        for (uint32_t divident = 0; divident < 256; ++divident) {
            uint32_t curByte = divident;
            for (uint8_t bit = 0; bit < 8; bit++) {
                if ((curByte & 0x00000001) != 0)
                {
                    curByte >>= 1;
                    curByte ^= Polynomial;
                }
                else
                {
                    curByte >>= 1;
                }
            }
            table[divident] = curByte & (0xFFFFFFFF >> (4 - size) * 8);
        }
    }
};

我不需要在运行时重新定义它。如何在编译时使用 constexpr genTable/R 填充表?

c++ c++20 constexpr if-constexpr
© www.soinside.com 2019 - 2024. All rights reserved.