十六进制字符到std::string的Constexpr转换
constexpr conversion of hex chars to std::string
我有很多这样的字符串:
"343536"_hex
,我想把它们转换成相应的字节串。我使用c++ 11,并定义了一个用户定义的字符串字面值来将这些字面值转换为十六进制字符串。然而,我目前拥有的转换不能被评估为我正在寻找的constexpr
。特别是我想使用这样的东西,但作为constexpr
:
std::string operator "" _hex(const char *s, std::size_t slen )
{
std::string str;
str.reserve(slen);
char ch[3];
unsigned long num;
ch[2] = ' ';
for ( ; slen; slen -= 2, s += 2) {
ch[0] = s[0];
ch[1] = s[1];
num = strtoul(ch, NULL, 16);
str.push_back(num);
}
return str;
}
测试驱动程序
int main()
{
std::string src{"653467740035"_hex};
for (const auto &ch : src)
std::cout << std::hex << std::setw(2) << std::setfill('0')
<< (unsigned)ch << 'n';
}
的示例输出65
34
67
74
00
35
要非常非常清楚地说明我的问题,是这样的:如何编写这种类型的c++ 11字符串文字转换,可以在编译时作为constexpr
进行评估?
为了实现您正在尝试做的事情,您将需要一些与constexpr
兼容的编译时string
类。但并没有这样的标准。我可以看到一些接近它的东西:
-
boost::mpl::string
,但是界面不是很漂亮。 -
boost::log::string_literal
,它有你想要的接口,但缺乏constexpr
支持。 -
std::string_literal
,这正是你正在寻找的,但它没有实现。如果你有一些空闲时间,它可能可以在c++ 11中实现。
为了简化这一切,让我们使用一个过度简化的string_literal
类。请注意,上面描述的一些类后面有一个