gpt4 book ai didi

c++ - 编译时字符串中的字符序列,无需递归

转载 作者:行者123 更新时间:2023-12-04 07:41:15 24 4
gpt4 key购买 nike

是的,这个话题可能看起来已经被问过一百次了,但我问的是非常不同的。
请不要让我误解:模板递归可能很棒,并且是在 C++03 中使用某些习语的唯一方法,但是在 MSVS 2017/2019 编译器中使用时可能会出现问题并获得可怕的 fatal error C1202: recursive type or function dependency context too complex .
我知道 gcc 和 clang 比 MSVS 管理更好的递归,但这次编译器是一个契约主题,不能改变。
我开始使用 boost::hana::string ,但是对于复杂的字符串(超过 2000 个字符),就会出现错误。
我想知道是否有某种方法可以复制 BOOST_HANA_STRING 的行为宏(基本上它需要一个字符串并将其转换为字符序列或 wchar 取决于输入字符串)但摆脱了递归。
我想付出的代价是只使用 C++17,通过使用 fold 来代替,但对我来说这是负担得起的。
顺便说一句,请不要提供operator""_cs解决方案,因为 MSVS 既不兼容这样的 gcc 扩展。
我想要实现的伪代码:STRING("Hello") => my_static_string<char, 'H', 'e', 'l', 'l', 'o'>

最佳答案

I wonder if there is some way to replicate the behaviour of BOOST_HANA_STRING macro (basically it takes a string and converts it into a char sequence, or wchar depending of input string) but getting rid of recursion.


嗯,这会很困难,因为 BOOST_HANA_STRING doesn't use recursion :
    namespace string_detail {
template <typename S, std::size_t ...N>
constexpr string<S::get()[N]...>
prepare_impl(S, std::index_sequence<N...>)
{ return {}; }

template <typename S>
constexpr decltype(auto) prepare(S s) {
return prepare_impl(s,
std::make_index_sequence<sizeof(S::get()) - 1>{});
}
}

#define BOOST_HANA_STRING(s) \
(::boost::hana::string_detail::prepare([]{ \
struct tmp { \
static constexpr decltype(auto) get() { return s; } \
}; \
return tmp{}; \
}())) \
注意没有递归。它只是获取字符串的大小,使用它来构建索引序列,并使用该序列来构建对字符串元素的包扩展。它总是恰好 2 个函数调用深;不多也不少。
你的问题不是递归;您的问题是 Visual Studio 不支持“2000”元素参数包。 C++ 标准只建议编译器支持 1024 个模板参数,和 Visual C++ support 2046 .我不会指望这个数字在 future 变得更大,所以你需要找到替代方法来做你在这里做的任何事情。
此外,C++20 允许您创建一个真正的编译时字符串类,该类存储实际字符的实际数组,您可以在正常的实际代码而不是元编程中实际使用这些字符。它们可以用作模板参数;单个模板参数。而 VC++ 已经对此提供了支持。

关于c++ - 编译时字符串中的字符序列,无需递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67453176/

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