c++ - 模板需要编译时 const 值
问题描述
伙计们。我有一种情况,模板参数取决于运行时间。我的功能:
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();
}
}
解决方案
#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
推荐阅读
- reactjs - “ReactJs”重置状态但不重置唯一 ID
- python - 处理 ValueError 的便捷方法:无法从重复轴重新索引
- r - 使用查找表(或数据字典)重命名多个 data_frames 的变量
- javascript - 如何使用 javascript 将 SYN 数据包发送到 Web 服务器?
- java - 重定向错误消息的代码流
- firebase - 如果应用程序已经在运行,Flutter 如何获取 firebase 动态链接?
- c# - 在 Visual Studio 中添加/引用开源项目的正确方法
- java - 查找符号 readline 时出错,并且找不到包
- html - 显示元素 div 弯曲以继续水平
- ios - 尝试运行从另一台 Mac 复制的程序时出现 Xcode 工作空间完整性错误