提问人:user3600124 提问时间:7/9/2023 更新时间:7/9/2023 访问量:114
C++17 文件系统,concat 多个字符串
c++17 filesystem, concat multiple strings
问:
此代码
std::filesystem::path = std::filesystem::current_path();
(((path += "str1") += "str2") += "str3");
看起来很乱。如何将多个字符串添加到路径中,同时又不使代码与所有这些括号混淆?也许是与此类似的可调参数函数?
path.concat("str1", "str2", "str3");
答:
3赞
fabian
7/9/2023
#1
您可以轻松地在运算符上创建一个包含折叠表达式的辅助函数模板:,
template<class ...Args>
void concat(std::filesystem::path& p, Args&&...args)
{
((p += std::forward<Args>(args)), ...);
}
concat(path, "str1", "str2", "str3");
1赞
Pepijn Kramer
7/9/2023
#2
如果你要输出路径,你可能也想在每个字符串之间放一个额外的'/'。
#include <iostream>
#include <string>
#include <sstream>
template<typename... args_t>
std::string concat(const std::string& path, char seperator, args_t&&... args)
{
std::ostringstream os;
os << path;
// add a seperator before each arg
((os << seperator << std::forward<args_t>(args)), ...);
return os.str();
}
int main()
{
std::string path{ "path" };
auto full_path = concat(path, '/', "str1", "str2", "str3");
std::cout << full_path;
return 0;
}
评论
1赞
Alan Birtles
7/9/2023
如果他们只想添加内置的路径元素,你可以这样做std::filesystem
path /= "str1" / "str2" / "str3"
0赞
Pepijn Kramer
7/9/2023
@AlanBirtles 检查;)
0赞
Alan Birtles
7/9/2023
好的,不适用于多个元素,但您仍然可以使用 godbolt.org/z/977f5cv6s 或/=
path = path / "str1" / "str2" / "str3"
path = std::filesystem::path{ "str1" } / "str2" / "str3"
评论
str1
str2
str3
path += (std::string("str1") + "str2" + "str3")
?