c++ 11编译时组合两个字符串的最简单方法
Simplest way to combine two strings at compile time with C++11
我正在尝试连接两个编译时间字符串:
constexpr const char* getString1() { return "abababa"; };
constexpr const char* getString2() { return "lalalal"; };
constexpr const char* getString3() { return getString1() + getString2(); }; //wont compile
有一个现代的,简单的方法在c++中做到这一点吗?
这是使用std::apply
的C++17
解决方案。
注意:我使用auto
和requires
将其推入C++20
。
这实际上可以通过利用std::apply
是constexpr
这一事实来实现,这意味着您可以根据其底层参数包访问和元组类型,包括数组:
#include <tuple>
#include <array>
#include <iostream>
//helper function:
//create array without the last element provided
//used to remove ' ' in concat
template <std::size_t N>
constexpr std::array<const char, N> trim(
auto head, auto... chars
) requires (sizeof...(chars) == N) {
if constexpr (sizeof...(chars) == 0) {
return std::array<const char, 0>{}; //ignore last element
} else {
return std::apply([&head](auto... trim_chars){
return std::array<const char, N>{head, trim_chars...}; //recurse
}, trim<N - 1>(chars...));
}
}
//concatonate 2 arrays by converting them into param backs using std::apply
//this works because std::apply is a constexpr function
template <std::size_t N, std::size_t M>
constexpr std::array<const char, N + M + 1> concat(
const std::array<const char, N + 1>& n,
const std::array<const char, M + 1>& m
) {
std::array<const char, N> trim_n = std::apply([](auto... args){return trim<N>(args...);}, n);
return std::apply([&](auto... n_chars){
return std::apply([&](auto... m_chars){
return std::array<const char, N + M + 1>{n_chars..., m_chars...};
}, m);
}, trim_n);
}
//example strings
constexpr std::array<const char, 4> x{"abc"};
constexpr std::array<const char, 4> y{"def"};
constexpr std::array<const char, 7> z = concat<3, 3>(x, y);
int main() {
std::cout << &x[0] << " + " << &y[0] << " = " << &z[0];
}
这个输出:abc + def = abcdef
有一个现代的,简单的方法在c++中做到这一点吗?
最后的答案是:
实际上在编译时使用constexpr
函数无法做到这一点。
return getString1() + getString2();
将尝试添加两个指针,这对编译器来说是没有意义的。
任何其他尝试都需要检查实际的字符字面量以进行连接(例如strcat()
),这在编译时是无法完成的。
可用的替代方法是使用注释中指出的宏。
也许有人能做一些黑巫术模板魔法,但我怀疑它是否值得付出努力。
相关文章:
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 两个字符串之间的数学运算
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 给定两个字符串 S 和 T.确定与 T 相差最小的 S 子字符串?
- gtest:检查字符串是否等于两个字符串之一
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 我可以在系统()中使用两个字符串吗?