用户定义的字符串文字的长度作为模板参数?

asc*_*ler 5 generic-programming user-defined-literals c++11

有什么办法可以得到这样的行为?

// Some definition(s) of operator "" _my_str
// Some definition of function or macro MY_STR_LEN

using T1 = MY_STR_LEN("ape"_my_str);
// T1 is std::integral_constant<std::size_t, 3U>.

using T2 = MY_STR_LEN("aardvark"_my_str);
// T2 is std::integral_constant<std::size_t, 8U>.
Run Code Online (Sandbox Code Playgroud)

似乎不是,因为字符串文字会立即传递some_return_type operator "" _my_str(const char*, std::size_t);给文字运算符模板,而不会传递给文字运算符模板(2.14.8 / 5)。即使几乎总是一个常量表达式,该size函数参数也不能用作模板参数。

但是似乎应该有某种方法可以做到这一点。

Ker*_* SB 5

仔细阅读C ++ 11 2.14.8会发现,“文字运算符模板”仅用于数字文字,而不用于字符串和字符文字。

但是,以下方法似乎使您可以constexpr访问字符串长度(但不能访问指针):

struct MyStr
{
    char const * str;
    unsigned int len;
    constexpr MyStr(char const * p, unsigned int n) : str(p), len(n) {}
};

constexpr MyStr operator "" _xyz (char const * s, unsigned int len)
{
    return MyStr(s, len);
}

constexpr auto s = "Hello"_xyz;
Run Code Online (Sandbox Code Playgroud)

测试:

#include <array>

using atype = std::array<int, s.len>; // OK
Run Code Online (Sandbox Code Playgroud)