C++17 文件系统,concat 多个字符串

c++17 filesystem, concat multiple strings

提问人:user3600124 提问时间:7/9/2023 更新时间:7/9/2023 访问量:114

问:

此代码

std::filesystem::path = std::filesystem::current_path();
(((path += "str1") += "str2") += "str3");

看起来很乱。如何将多个字符串添加到路径中,同时又不使代码与所有这些括号混淆?也许是与此类似的可调参数函数?

path.concat("str1", "str2", "str3");
C++ STL C++17 文件系统 STD

评论

0赞 Jerry Coffin 7/9/2023
是否表示文件名的一部分,或者它们是子目录,因此您正在当前目录下构建路径?str1str2str3
0赞 user3600124 7/9/2023
我正在尝试向文件名添加额外信息。我理解你的问题,如果是子目录,可以使用 / 目录分隔符附加这些子目录
2赞 Alan Birtles 7/9/2023
path += (std::string("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::filesystempath /= "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"