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函数参数也不能用作模板参数。
但是似乎应该有某种方法可以做到这一点。
仔细阅读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)