gpt4 book ai didi

C++ 可变参数连接路径

转载 作者:行者123 更新时间:2023-12-03 06:56:00 26 4
gpt4 key购买 nike

我尝试使用可变参数模板编写一个连接路径函数。这是我的做法:

template<typename T>
T&& join_path (T&& path) {
return path;
}

template<typename T, typename ... Args>
std::string join_path (T&& path1, Args&& ... paths)
{
static_assert(std::is_same<typename std::decay<T>::type, std::string>::value ||
std::is_same<typename std::decay<T>::type, const char *>::value,
"T must be a basic_string");

std::string p2 = join_path(std::forward<Args>(paths)...);
if (!p2.empty() && p2[0] == '/')
return path1 + p2;

return path1 + '/' + p2;
}

但是有一个问题,当我传递像 join_path("system", path) 这样的字符串文字时,T 被认为是 const char *。所以我不能使用+运算符。我该如何解决?

我想到的一个修复方法是 return std::string(path1) + '/' + p2;。但它不会引入额外的复制吗?

最佳答案

自 C++17 以来,您可能会使用 std::string_view:

std::string join_path(std::initializer_list<std::string_view> paths)
{
std::string res;
const char* sep = "";
for (auto p : paths) {
res += (!p.empty() && p[0] == '/') ? "" : sep
res += p;
sep = "/";
}
return res;
}

template<typename ... Ts>
std::string join_path (Ts&&... paths)
{
static_assert(((std::is_same<typename std::decay<Ts>::type, std::string>::value ||
std::is_same<typename std::decay<Ts>::type, const char *>::value) || ...),
"T must be a basic_string");
return join_path({paths...});
}

Demo

关于C++ 可变参数连接路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64841681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com