在C++20中,可以编写一个只接受字符串文字的 Package 类。
struct string_literal
{
template<size_t N>
consteval Wrapper(char const (&s)[N]) : p(s) {}
char const* p;
};
void takes_literal(string_literal lit) {
// use lit.p here
}
根据OP自己的答案https://stackoverflow.com/a/74922953
是否也可以编写一个只匹配字符串字面量的概念?
2条答案
按热度按时间6kkfgxo01#
指向字符串常量的
char const*
实际上与任何其他char const*
没有什么不同。常量从数组开始的事实是无关紧要的,因为也可以创建非常量字符数组。据我所知,只有一个区别:指向字符串文本的指针 * 不能 * 用作非类型模板参数。这并不是特别有用,即使我们被限制在编译时执行代码,你也可以得到非文本的
char const*
,它也不能用作NTTP(通过创建一个std::string
,现在可以在编译时完成。你可以在string::c_str
的指针上调用constexpr
函数,但你不能将结果用作NTTP)。你能做的最好的事情就是创建一个用户定义的文本操作符来返回你的
string_literal
对象。你可以使它只有这个文本操作符可以构造这样一个类型(当然除了复制)。但是即使这样,他们也可以用一个非文本直接调用你的operator""
,而你对此无能为力。相反,您应该重新评估为什么需要知道它是否是字符串文字量 * 特别是 *。
fxnxkyjh2#
尽管
const char(&)[N]
不一定是字符串文字,但您可以创建concept来匹配const char(&)[N]
:Demo