宏从一开始就无法做到这一点。
const collation_t collation_ascii[256]
头文件中定义了一个数组。类型
using collation_t = struct _collation {
wchar_t l;
wchar_t u;
};
定义大小写字符的比例。要实际初始化数组元素,请使用模板
template<const size_t normal>
constexpr collation_t COLLATION() {
return { normal, normal };
}
template<const size_t lower, const size_t upper>
constexpr collation_t COLLATION() {
return { lower, upper };
}
template<const size_t number, const size_t lower, const size_t upper>
constexpr collation_t COLLATION() {
return { lower, upper };
}
他工作。但是大多数数组元素都有内容{X, X}
,也就是唯一的。您需要类似 的东西COLLATION_RANGE(Begin, End)
,它将用值补充数组COLLATION<Current, Current, Current>
,它以从 1到包含Current
的步长“运行” 。在 SO 上有一个展开循环的选项(我找不到链接),或者更确切地说重复该函数一定次数(展开),但我无法调整此选项。Begin
End
也就是说,我想要这个“糖”:
const collation_t collation_ascii[256]={
COLLATION_RANGE<0, 64>(),
COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
COLLATION<'y','Y'>(), COLLATION<'z','Z'>(),
COLLATION_RANGE<91,60>(),
COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
COLLATION<'y','Y'>(), COLLATION<'z','Z'>(),
COLLATION_RANGE<123,255>()
}
代替
const collation_t collation_ascii[256]={
COLLATION<0>(), COLLATION<1>(), COLLATION<2>(), COLLATION<3>(),
COLLATION<4>(), COLLATION<5>(), COLLATION<6>(), COLLATION<7>(),
COLLATION<8>(), COLLATION<9>(), COLLATION<10>(), COLLATION<11>(),
COLLATION<12>(), COLLATION<13>(), COLLATION<14>(), COLLATION<15>(),
COLLATION<16>(), COLLATION<17>(), COLLATION<18>(), COLLATION<19>(),
COLLATION<20>(), COLLATION<21>(), COLLATION<22>(), COLLATION<23>(),
COLLATION<24>(), COLLATION<25>(), COLLATION<26>(), COLLATION<27>(),
COLLATION<28>(), COLLATION<29>(), COLLATION<30>(), COLLATION<31>(),
COLLATION<' '>(), COLLATION<'!'>(), COLLATION<'"'>(), COLLATION<'#'>(),
COLLATION<'$'>(), COLLATION<'%'>(), COLLATION<'&'>(), COLLATION<'\''>(),
COLLATION<'('>(), COLLATION<')'>(), COLLATION<'*'>(), COLLATION<'+'>(),
COLLATION<','>(), COLLATION<'-'>(), COLLATION<'.'>(), COLLATION<'/'>(),
COLLATION<'0'>(), COLLATION<'1'>(), COLLATION<'2'>(), COLLATION<'3'>(),
COLLATION<'4'>(), COLLATION<'5'>(), COLLATION<'6'>(), COLLATION<'7'>(),
COLLATION<'8'>(), COLLATION<'9'>(), COLLATION<':'>(), COLLATION<';'>(),
COLLATION<'<'>(), COLLATION<'='>(), COLLATION<'>'>(), COLLATION<'?'>(),
COLLATION<'@'>(),
COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
COLLATION<'y','Y'>(), COLLATION<'z','Z'>(), COLLATION<'['>(),
COLLATION<'\\'>(), COLLATION<']'>(), COLLATION<'^'>(), COLLATION<'_'>(),
COLLATION<'`'>(),
COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
COLLATION<'y','Y'>(), COLLATION<'z','Z'>(), COLLATION<'{'>(),
COLLATION<'|'>(), COLLATION<'}'>(), COLLATION<'~'>(), COLLATION<127>(),
COLLATION<128>(), COLLATION<129>(),
COLLATION<130>(), COLLATION<131>(), COLLATION<132>(), COLLATION<133>(),
COLLATION<134>(), COLLATION<135>(), COLLATION<136>(), COLLATION<137>(),
COLLATION<138>(), COLLATION<139>(),
COLLATION<140>(), COLLATION<141>(), COLLATION<142>(), COLLATION<143>(),
COLLATION<144>(), COLLATION<145>(), COLLATION<146>(), COLLATION<147>(),
COLLATION<148>(), COLLATION<149>(),
COLLATION<150>(), COLLATION<151>(), COLLATION<152>(), COLLATION<153>(),
COLLATION<154>(), COLLATION<155>(), COLLATION<156>(), COLLATION<157>(),
COLLATION<158>(), COLLATION<159>(),
COLLATION<160>(), COLLATION<161>(), COLLATION<162>(), COLLATION<163>(),
COLLATION<164>(), COLLATION<165>(), COLLATION<166>(), COLLATION<167>(),
COLLATION<168>(), COLLATION<169>(),
COLLATION<170>(), COLLATION<171>(), COLLATION<172>(), COLLATION<173>(),
COLLATION<174>(), COLLATION<175>(), COLLATION<176>(), COLLATION<177>(),
COLLATION<178>(), COLLATION<179>(),
COLLATION<180>(), COLLATION<181>(), COLLATION<182>(), COLLATION<183>(),
COLLATION<184>(), COLLATION<185>(), COLLATION<186>(), COLLATION<187>(),
COLLATION<188>(), COLLATION<189>(),
COLLATION<190>(), COLLATION<191>(), COLLATION<192>(), COLLATION<193>(),
COLLATION<194>(), COLLATION<195>(), COLLATION<196>(), COLLATION<197>(),
COLLATION<198>(), COLLATION<199>(),
COLLATION<200>(), COLLATION<201>(), COLLATION<202>(), COLLATION<203>(),
COLLATION<204>(), COLLATION<205>(), COLLATION<206>(), COLLATION<207>(),
COLLATION<208>(), COLLATION<209>(),
COLLATION<210>(), COLLATION<211>(), COLLATION<212>(), COLLATION<213>(),
COLLATION<214>(), COLLATION<215>(), COLLATION<216>(), COLLATION<217>(),
COLLATION<218>(), COLLATION<219>(),
COLLATION<220>(), COLLATION<221>(), COLLATION<222>(), COLLATION<223>(),
COLLATION<224>(), COLLATION<225>(), COLLATION<226>(), COLLATION<227>(),
COLLATION<228>(), COLLATION<229>(),
COLLATION<230>(), COLLATION<231>(), COLLATION<232>(), COLLATION<233>(),
COLLATION<234>(), COLLATION<235>(), COLLATION<236>(), COLLATION<237>(),
COLLATION<238>(), COLLATION<239>(),
COLLATION<240>(), COLLATION<241>(), COLLATION<242>(), COLLATION<243>(),
COLLATION<244>(), COLLATION<245>(), COLLATION<246>(), COLLATION<247>(),
COLLATION<248>(), COLLATION<249>(),
COLLATION<250>(), COLLATION<251>(), COLLATION<252>(), COLLATION<253>(),
COLLATION<254>(), COLLATION<255>()
}
需要注意的是,对于位置 'a' 和 'A' 的数组值是相同的。根据答案,我为自己准备了一个解决方案https://godbolt.org/z/7h2XNi 也许它会对某人有所帮助。
出于这些目的,没有必要使用模板。这个问题可以更简单地解决:
两种解决方案的共同部分
声明和创建
Collation
保持不变:但是要创建一个特定
Collation
的,我们将使用专业化:为了美观和最小化复制/粘贴错误,您可以将这个东西包装在一个宏中:
使用 STL 的 C++14 解决方案
现在
std::integer_sequence
用以下内容填充数组:完整代码:
没有 STL 的 C++11 中的解决方案
想法是一样的,只是我们必须实现某种
std::aray
和
std::integer_sequence
/std::make_integer_sequence
现在我们用我们的“自行车”填充数组
完整代码