gpt4 book ai didi

c++ - 如何使用 C++11 用户定义文字获取最小变量

转载 作者:可可西里 更新时间:2023-11-01 16:39:34 26 4
gpt4 key购买 nike

我一直在研究 C++11 的一些新特性,其中一些给我留下了深刻的印象,尤其是用户定义的文字。

这些允许您定义形式为 999_something 的文字,其中 something 控制对 999 执行的操作以生成文字。所以不再需要使用:

#define MEG * 1024 * 1024
int ten_meg = 10 M;

我在想这会很好地实现大量的下划线,比如 1_000_000_blah 这将匹配 Perl 的可读性,尽管 Perl 在某种程度上可读的想法对我来说似乎很幽默:-)

它对于像 1101_1110_b0011_0011_1100_1111_b 这样的二进制值也很方便。

很明显,由于 _ 字符,这些字符需要是原始模式类型,处理 C 字符串,我同意这一点。

无法弄明白的是如何根据操作数的大小提供不同的类型。例如:

1101_1110_b

应该给出一个 char(当然假设 char 是 8 位的)同时:

0011_0011_1100_1111_b

将提供 16 位类型。

我可以从文字运算符函数 operator"" 本身(通过计算数字字符)中获取操作数的长度,但返回类型似乎固定为函数,所以我不能基于此返回不同的类型。

这可以在用户定义的类型框架内使用单个后缀 _b 来完成,还是我需要诉诸手动拆分类型(_b8_b16 等等)并提供大部分重复的功能?

最佳答案

您需要知道字符串的大小,实现这一点的唯一方法是使用参数包来使用 sizeof...。您应该能够使用可变参数模板 operator"" 实现您想要的:

#include <cstdint>
#include <type_traits>

template<char... String>
auto operator "" _b()
-> typename std::conditional<sizeof...(String) <= 8,
uint8_t,
typename std::conditional<sizeof...(String) <= 16,
uint16_t,
uint32_t
>::type
>::type
{
// Do whatever you want here
}

这是一个测试用例:

int main()
{
auto a = 10000001_b;
auto b = 100000001_b;

std::cout << std::boolalpha;
std::cout << std::is_same<decltype(a), uint8_t>::value << "\n"; // true
std::cout << std::is_same<decltype(b), uint16_t>::value << "\n"; // true
}

不幸的是,该解决方案无法处理数字分隔符。此外,std::conditional 机制非常丑陋。您可以使用 boost::mpl::vectorboost::mpl::at 和一些算术运算来做一些更好的事情。

关于c++ - 如何使用 C++11 用户定义文字获取最小变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com