gpt4 book ai didi

c++ - 将字符串存储在constexpr结构中

转载 作者:行者123 更新时间:2023-12-02 09:56:40 25 4
gpt4 key购买 nike

是否可以在constexpr结构中存储字符串:

到目前为止,我只能想出:

struct A
{
constexpr A(std::string_view n): m_name(n) {}
constexpr auto name(){ return m_name; }

std::string_view m_name; // This might become dangling!!
}



如果这个类是 ,只有这样使用,这显然是一个好主意
A a = {"Hello"};
constexpr A b = {"World"};

而不是这样
auto makeA(std::string n) { return A{n}; }
A a = makeA("Hello"); // Dangling internal std::string_view

我需要 constexpr在编译时构造该结构。
是否有可能使它在运行时更安全,因为使用std::string_view则不是。

最佳答案

您可以这样做:

template<typename Char, Char... Cs>
struct CharSeq
{
static constexpr const Char s[] = {Cs..., 0}; // The unique address
};

// That template uses the extension
template<typename Char, Char... Cs>
constexpr CharSeq<Char, Cs...> operator"" _cs() {
return {};
}

如果您不能使用扩展名,请从 String-interning at compiletime for profiling看到我的答案,以拥有 MAKE_STRING宏(确实更冗长,并且对可接受的字符串长度进行硬编码限制)。

然后
struct A
{
template <char ... Cs>
constexpr A(CharSeq<char, Cs...>) : m_name(CharSeq<char, Cs...>::s) {}

constexpr auto name(){ return m_name; }

std::string_view m_name;
};

仅具有类似于以下内容的有效用法:
A a = {"Hello"_cs};
constexpr A b = {"World"_cs};

关于c++ - 将字符串存储在constexpr结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59542785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com