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

时间:2013-06-22 15:54:03

标签: c++11 generic-programming user-defined-literals

有没有办法获得这样的行为?

// 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>.

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

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

1 个答案:

答案 0 :(得分:4)

阅读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;

测试:

#include <array>

using atype = std::array<int, s.len>; // OK