繁体   English   中英

为什么 C++ 不支持在编译时不使用宏的常量字符串连接的简洁代码?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM