C++20概念匹配字符串文字

qvtsj1bj  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(129)

在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
是否也可以编写一个只匹配字符串字面量的概念?

6kkfgxo0

6kkfgxo01#

指向字符串常量的char const*实际上与任何其他char const*没有什么不同。常量从数组开始的事实是无关紧要的,因为也可以创建非常量字符数组。据我所知,只有一个区别:指向字符串文本的指针 * 不能 * 用作非类型模板参数。
这并不是特别有用,即使我们被限制在编译时执行代码,你也可以得到非文本的char const*,它也不能用作NTTP(通过创建一个std::string,现在可以在编译时完成。你可以在string::c_str的指针上调用constexpr函数,但你不能将结果用作NTTP)。
你能做的最好的事情就是创建一个用户定义的文本操作符来返回你的string_literal对象。你可以使它只有这个文本操作符可以构造这样一个类型(当然除了复制)。但是即使这样,他们也可以用一个非文本直接调用你的operator"",而你对此无能为力。
相反,您应该重新评估为什么需要知道它是否是字符串文字量 * 特别是 *。

fxnxkyjh

fxnxkyjh2#

尽管const char(&)[N]不一定是字符串文字,但您可以创建concept来匹配const char(&)[N]

template <typename T>
struct is_str_literal_impl : std::false_type{};

template <std::size_t N>
struct is_str_literal_impl<const char[N]> : std::true_type{};

template <typename T>
concept concept_str_literal = is_str_literal_impl<T>::value;

void takes_literal(concept_str_literal auto&  lit) {
  // use lit.p here
}

Demo

相关问题