如果可以在编译C++ 11模式(或以上),那么你被允许来索引到字符串文字以恒定表达时间:
#define STR_TO_MULTI_CHAR_LITERAL(s) \
(sizeof(s) == 5 \
? s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3] \
: throw "wrong length")
some_type<STR_TO_MULTI_CHAR_LITERAL("abcd")> xyz;
这就是说,如果你”重新允许使用C++ 11模式下,您应该能够使用constexpr
还有:
constexpr std::int32_t strToMultiCharLiteral(char const (&s)[5]) {
return s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3];
}
some_type<strToMultiCharLiteral("abcd")> xyz;
你甚至可以编写一个用户自定义字符串文字:
constexpr std::int32_t operator""_multiCharLiteral(char const *s, std::size_t len)
{
return len == 4 ? s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3]
: throw "wrong length";
}
some_type<"abcd"_multiCharLiteral> xyz;
*“Microsoft的charize运算符”*所以你使用MSVC编译器?哪个版本? VS2015/MSVC 19支持constexpr功能.. – dyp
@dyp'clang -fms-extensions',虽然结果应该在没有* constexpr的MSVC下工作。 – refi64
可能会将字符串分解为一系列字符([通过宏](http://web.archive.org/web/20130930081424/http://cpp-next.com/archive/2012/10/) using-strings-in-c-template-metaprograms /)),然后从该字符序列重建一个数字。 – dyp