2013-06-22 46 views
2

有什么办法可以获得这样的行为吗?用户定义的字符串文字的长度作为模板参数?

// 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)。该大小函数参数不能用作模板参数,尽管它几乎总是一个常量表达式。

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

回答

3

阅读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 
+0

是的,不过这只是针对一个特定的对象's'。所以我们需要为每个用户定义的文字命名? – aschepler

+1

@aschepler:类似于'“abc”_xyz.len'也应该有效。 –