[英]Why does C++ not support concise code for constant string concatenation at compile time without using macros?
我有一个代码库,里面有很多文本操作。 它使用 C++ 宏的工具(空格运算符?)非常好地读取,它整齐地连接常量字符串。
我想避免使用宏,因为它们具有全局效果并开始使用名称空间以产生良好效果。
不幸的是,如果不使用宏,我找不到任何方法来复制 cpp 代码的当前可读性,我怀疑是否有任何方法可以实现我想要的。
因此我的问题。
abc.h
#define snippet1 "some text1"
#define snippet2 "some text2"
xyz.cpp文件
std::string s = "some text" snippet1 "some more" snippet2;
附录:代码可以在运行时使用 std::string巧妙地处理
using namespace std::string_literals;
const auto snippet = "abcdefghijklmnopqrstuvwyyz"s;
auto s = "some text"s + snippet + "some more"s;
但由于 std::string 被堆分配,这非常低效。 我的问题是为什么 C++ 似乎没有任何有效的方法来在编译时管理常量字符串......除了宏之外,它们的服务员 scope 问题。
假设 C++20,在编译时连接字符串文字。 除了s
之外,没有运行时堆分配:
template<std::size_t... Ns>
consteval auto strlit_cat(const char(&... lits)[Ns]) {
auto result = std::array<char, ((Ns-1) + ... + 1)>{};
std::ranges::copy(std::views::join(std::array{std::string_view{lits, Ns-1}...}),
std::begin(result));
return result;
}
constexpr char snippet1[] = "some text1";
constexpr char snippet2[] = "some text2";
std::string s = strlit_cat("some text", snippet1, "some more", snippet2).data();
function 也适用于嵌入 null 个字符的文字,并将字符串作为std::array
of char
返回。 但是, s
的构造不适用于嵌入的 null 个字符,但在您的问题示例中也不起作用。
这也可以通过将std::array
包装成固定长度的字符串 class 复制std::string
的接口(就其意义而言)和到std::string
的转换运算符来使其更实用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.