来自用户定义文字的字符的整数序列,将字符串作为参数

时间:2016-01-30 04:41:30

标签: c++ templates c++14 template-meta-programming user-defined-literals

目前,只有双打才能在用户定义的文字中生成字符模板:

template <char...> double operator "" _x();
// Later
1.3_x; // OK
"1.3"_y; // C++14 does not allow a _y user-
         // defined operator to parse that as a template of chars

是否有一种聪明的方法可以使用用户定义的文字生成std::integer_sequence个字符。换句话说,_y(const char*, std::size_t)的代码是什么,以便最终得到std::integer_sequence<char, '1', '.', '3'>

1 个答案:

答案 0 :(得分:0)

在这个时间点,我们能够(便携)做的最好的事情就是演示for vtmpl::string的宏技巧。基本上,我们创建一个访问列表,如

#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)

...我们修剪以获得所需的结果。

第一步很容易通过BOOST_PP_ENUM完成,虽然递归宏也很好(来自here的定义):

#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中定义了asksaveasfilename