gpt4 book ai didi

c++ - 初始化 C++11 数组的最佳方法,该数组主要是身份映射

转载 作者:太空宇宙 更新时间:2023-11-04 13:59:46 25 4
gpt4 key购买 nike

目前我有一些代码如下所示:

#define ______ 0x0000
static const uint16_t plane0[256] = {
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005A, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, 0x039C, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
...
};
#undef ______

uint16_t caseup(uint16_t wc)
{
return (plane0[wc] == 0x0000) ? wc : plane0[wc];
}

我真的很想用一个简单的 return plane0[wc] 替换那个 caseup 函数。从总体上看,额外的比较和分支可能不会非常昂贵,但如果我们去掉它,代码肯定会更高效。

但我不想重写表格。甚至不使用工具来重写它——我不希望我们的大小写映射表被大量垃圾十六进制值弄得乱七八糟。我希望该表主要保持原始宏化,仅在实际需要非标识大小写映射的地方使用十六进制值。

在 C++11 中最简洁的方法是什么?

最佳答案

我想到了这个:

template<int N>
struct PlaneMapping {
uint16_t i;
uint16_t data[N];

template<typename... Args>
constexpr PlaneMapping(Args... a) : i(0), data { uint16_t(a ? (i++,a) : i++)... }
{}
};

static const PlaneMapping<256> plane0(
______, ______, ______, ______, ______, ______, ______, ______,
______, ______, ______, ______, ______, ______, ______, ______,
...
);

uint16_t caseup(uint16_t wc)
{
return plane0.data[wc];
}

我猜这是相当干净的,但是所有那些 i++ 都很丑陋,你必须通过 -O1 或更好的方法才能完全编译减少到静态数据,而不是从 _main 运行大量代码。有更清洁的解决方案吗?

关于c++ - 初始化 C++11 数组的最佳方法,该数组主要是身份映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19780459/

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