На данный момент лучшее, что мы можем (переносимо) сделать, — это трюк с макросами, как показано для vtmpl::string
. По сути, мы создаем список доступов, таких как
"abcd" -> {(0 < sizeof "abcd"? "abcd"[0] : 0), (1 < sizeof "abcd"? "abcd"[1] : 0), ...}
…которые мы обрезаем для получения желаемого результата.
Первый шаг легко сделать через BOOST_PP_ENUM
, хотя рекурсивные макросы тоже подойдут (определение взято здесь) :
#define VTMPL_SPLIT_1(s, x, m) m(s, x)
#define VTMPL_SPLIT_4(s, x, m) VTMPL_SPLIT_1 (s, x, m), VTMPL_SPLIT_1 (s, x+1 , m), VTMPL_SPLIT_1 (s, x+2 , m), VTMPL_SPLIT_1 (s, x+3 , m)
#define VTMPL_SPLIT_16(s, x, m) VTMPL_SPLIT_4 (s, x, m), VTMPL_SPLIT_4 (s, x+4 , m), VTMPL_SPLIT_4 (s, x+8 , m), VTMPL_SPLIT_4 (s, x+12 , m)
#define VTMPL_SPLIT_64(s, x, m) VTMPL_SPLIT_16 (s, x, m), VTMPL_SPLIT_16 (s, x+16 , m), VTMPL_SPLIT_16 (s, x+32 , m), VTMPL_SPLIT_16 (s, x+48 , m)
#define VTMPL_SPLIT_256(s, x, m) VTMPL_SPLIT_64 (s, x, m), VTMPL_SPLIT_64 (s, x+64 , m), VTMPL_SPLIT_64 (s, x+128, m), VTMPL_SPLIT_64 (s, x+194, m)
#define VTMPL_SPLIT_1024(s, x, m) VTMPL_SPLIT_256(s, x, m), VTMPL_SPLIT_256(s, x+256, m), VTMPL_SPLIT_256(s, x+512, m), VTMPL_SPLIT_256(s, x+768, m)
Использование вышеуказанного выглядит так (включая обрезку):
#define VTMPL_STRING_IMPL(str, n) vtmpl::rtrim<vtmpl::value_list<decltype(*str), VTMPL_SPLIT_##n(str, 0, VTMPL_ARRAY_SPLIT)>>::type
#
#define VTMPL_STRING(str) VTMPL_STRING_IMPL(str, 64 )
Где rtrim
определено в algorithms.hxx
.
person
Columbo
schedule
22.03.2016
integer_sequence
? Это пахнет XY-проблемой. - person Columbo   schedule 30.01.2016string_literal<N>
. - person T.C.   schedule 30.01.2016template<typename CharT, CharT... Chars> stuff operator "" _x();
UDL, поддерживаемое gcc и clang. - person melak47   schedule 30.01.2016constexpr const char literal[] = "delta"; using X = make_char_sequence<sizeof(literal), literal>;
. Дайте мне знать, если вас интересуют подробности. - person Rumburak   schedule 01.02.2016