c++ - 是否可以使用 C++17 折叠表达式仅折叠包的一部分?
问题描述
我试图弄清楚如何使用 C++17 折叠表达式仅折叠可变参数模板包的一部分。假设我想创建一个编译时“分隔字符串”,例如"str1_str2_str3_....."
使用这样的代码可以很容易地完成(只是一个例子):
std::string result;
template<class... Strings>
ConcatString(Strings&... strs)
{
(ConcatString(strs), ...);
}
template <class String>
void ConcatString(String& str)
{
result += str + "_"
}
然后我们可以这样执行
std::string s1 = "s1", s2 = "s2", s3 = "s3";
ConcatString(s1, s2, s3);
// result == "s1_s2_s3_"
如您所见,最后一个分隔符有问题。如果没有运行时检查,有什么办法可以避免这个问题?我可以想象的一种解决方案是仅折叠 (N - 1) 个 args 并“手动”连接最后一个。
解决方案
您可以ConcatString
递归调用并使用 constexpr if 以避免运行时检查
template<typename String, typename... Strings>
void ConcatString(String& str, Strings&... strs) {
if constexpr(sizeof...(strs) == 0) {
result += str;
} else {
result += str + "_";
ConcatString(strs...);
}
}
推荐阅读
- c# - 使用空间折叠的文本块
- flask - 烧瓶路线缺少已经给出的参数
- command-line-interface - 带有 --rule 选项的 ESLint CLI
- tensorflow - 如何在移动设备上加快推理 FPS
- c# - 如何使用 C# 将 data:image/svg+xml;utf8 图像保存为有效的图像文件?
- photon - 在 Photon Bolt 中,如何将令牌中的 int 数据列表与事件一起发送?
- javascript - 带有选择元素的 Material Ui 错误
- php - 我的图片没有出现在我的 index.php 文件中
- javascript - 在 react js 中使用 map 启动多个功能
- python - min() arg 是一个空序列,如果没有数字进入我的 def 怎么办