Для шаблона требуется постоянное значение времени компиляции - PullRequest
0 голосов
/ 10 октября 2018

люди.У меня есть ситуация, как, шаблон аргумента зависит во время выполнения.Моя функция:

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 голосов
/ 10 октября 2018
#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
...