模板需要编译时常量值

时间:2018-10-10 17:19:40

标签: c++ templates compile-time-constant

人。我有一种情况,模板参数取决于运行时间。 我的功能:

string DecToBin(int num)
{
    bitset<(num < 256 ? 8 : 32)> bits(num);
    return bits.to_string();
}

因此,不能确定它是否可以编译。除了下面的示例,什么解决方案可以? 谢谢

string DecToBin(int num)
{
    if(num < pow(2, 8))
    {
        bitset<8> bits(num);
        return bits.to_string();
    } else if(num < pow(2, 16))
    {
        bitset<16> bits(num);
        return bits.to_string();
    } else if(num < pow(2, 32))
    {
        bitset<32> bits(num);
        return bits.to_string();
    } else
    {
        bitset<64> bits(num);
        return bits.to_string();
    }
}

1 个答案:

答案 0 :(得分:2)

#include <cstdint>
#include <string>
#include <bitset>
#include <iostream>
#include <iomanip>

std::string DecToBin(std::uint64_t num)
{
    std::bitset<64> bits( num );
    int num_bits{ 8 };

    for (uint64_t test{ 0xff };
         ~test && test < num;
         test = (test << 8) | test, num_bits += 8);     

    return bits.to_string().substr(64 - num_bits);
}

int main()
{
    for (std::uint64_t i{1}; i != 0; i <<= 1)
        std::cout << std::setw(64) << DecToBin(i) << '\n';
}

输出:

                                                        00000001
                                                        00000010
                                                        00000100
                                                        00001000
                                                        00010000
                                                        00100000
                                                        01000000
                                                        10000000
                                                0000000100000000
                                                0000001000000000
                                                0000010000000000
                                                0000100000000000
                                                0001000000000000
                                                0010000000000000
                                                0100000000000000
                                                1000000000000000
                                        000000010000000000000000
                                        000000100000000000000000
                                        000001000000000000000000
                                        000010000000000000000000
                                        000100000000000000000000
                                        001000000000000000000000
                                        010000000000000000000000
                                        100000000000000000000000
                                00000001000000000000000000000000
                                00000010000000000000000000000000
                                00000100000000000000000000000000
                                00001000000000000000000000000000
                                00010000000000000000000000000000
                                00100000000000000000000000000000
                                01000000000000000000000000000000
                                10000000000000000000000000000000
                        0000000100000000000000000000000000000000
                        0000001000000000000000000000000000000000
                        0000010000000000000000000000000000000000
                        0000100000000000000000000000000000000000
                        0001000000000000000000000000000000000000
                        0010000000000000000000000000000000000000
                        0100000000000000000000000000000000000000
                        1000000000000000000000000000000000000000
                000000010000000000000000000000000000000000000000
                000000100000000000000000000000000000000000000000
                000001000000000000000000000000000000000000000000
                000010000000000000000000000000000000000000000000
                000100000000000000000000000000000000000000000000
                001000000000000000000000000000000000000000000000
                010000000000000000000000000000000000000000000000
                100000000000000000000000000000000000000000000000
        00000001000000000000000000000000000000000000000000000000
        00000010000000000000000000000000000000000000000000000000
        00000100000000000000000000000000000000000000000000000000
        00001000000000000000000000000000000000000000000000000000
        00010000000000000000000000000000000000000000000000000000
        00100000000000000000000000000000000000000000000000000000
        01000000000000000000000000000000000000000000000000000000
        10000000000000000000000000000000000000000000000000000000
0000000100000000000000000000000000000000000000000000000000000000
0000001000000000000000000000000000000000000000000000000000000000
0000010000000000000000000000000000000000000000000000000000000000
0000100000000000000000000000000000000000000000000000000000000000
0001000000000000000000000000000000000000000000000000000000000000
0010000000000000000000000000000000000000000000000000000000000000
0100000000000000000000000000000000000000000000000000000000000000
1000000000000000000000000000000000000000000000000000000000000000