Constexpr转换为const char []
它发生在很多人身上,而且发生在我身上。 我被卡在C ++编译时字符串中。
我决定采取显然无法使用的方法:使用template <char...>
类。
这是我想出来的,这是非常普遍的,没有什么特别的,也是行不通的。
template <char... chars> class string
{
public:
static constexpr const char value[] = {chars...};
constexpr string()
{
}
constexpr operator decltype(value) & () const
{
return value;
}
};
template <char... chars> constexpr const char string <chars...> :: value[];
我的想法是创建一个string
实例constexpr
constructible并公开某种constexpr投射,以便提供其内容。
现在,如果我这样做
static constexpr const char x[] = "ciao";
template <const char * str> void print()
{
std :: cout << str << std :: endl;
}
print <x> ();
这是有效的,并说ciao
。 如果我这样做,我也会得到ciao
std :: cout << string <'c', 'i', 'a', 'o'> {} << std :: endl;
要么
print <string <'c', 'i', 'a', 'o', ' '> :: value> ();
但是当我这样做
print <string <'c', 'i', 'a', 'o', ' '> {}> ();
我得到: No matching function for call to print
。
我绝对错过了一些东西。 做我想做的事情是不可行的? 让一个实例做一个constexpr转换来以某种方式返回value
? 如果这样做的话,我可以在编译时轻松地进行操作和字符串操作,“唯一”的缺点是超无聊的'i', 'n', 'i', 't', 'i', 'a', 'l', 'i', 'z', 'a', 't', 'i', 'o', 'n'
。
进一步实验
我做了另一个完美的实验。
template <char... chars> class string
{
public:
constexpr string()
{
}
constexpr operator size_t () const
{
return sizeof...(chars);
}
};
template <size_t length> void print()
{
std :: cout << length << std :: endl;
}
print <string <'c', 'i', 'a', 'o'> {}> ();
它打印出一个漂亮的4
。
在C ++ 14中,模板参数对模板非类型参数的限制是:
非类型,非模板模板参数的模板参数应该是以下之一:
*对于整型或枚举类型的非类型模板参数,模板参数类型的转换常量表达式(5.19); 要么
*非类型模板参数的名称; 要么
*一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的完整对象的地址,或具有外部或内部链接的函数,包括函数模板和函数模板id,但不包括非静态类成员(忽略括号)作为&
ID表达,其中的ID-expression是对象或函数的名称,除了&
如果名称是指功能或阵列,并且如果相应的模板的参数将被省略,可以省略是一个参考; 要么
*一个常量表达式,其值为一个空指针值(4.10); 要么
*一个常量表达式,其值为空成员指针值(4.11); 要么
*一个指向成员的指针,如5.3.1所述; 要么
* std::nullptr_t
类型的常量表达式。
在你的例子中, string<'c', 'i', 'a', 'o', '