如果可以在編譯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