#include <string>
#include <string_view>
template<typename... Args>
std::string_view concatenateBuffer(std::string &buffer, Args &&... args){
static_assert((std::is_constructible_v<std::string_view, Args> && ...));
buffer.clear();
(buffer.append(std::forward<Args>(args)), ...);
return buffer;
}
template<typename ...Ts>
std::string_view concat(std::string s, Ts ...ts){
return concatenateBuffer(s , (("," , ts) , ...) );
}
#include <iostream>
int main(){
std::string b;
std::cout << concat(b, "a") << '\n';
std::cout << concat(b, "a", "b") << '\n';
}
我有函数
concatenateBuffer
,我在这里展示的版本是简化的,但它的作用是将“字符串”(char *,string_view,string)附加到buffer
。
我想做另一个函数
concat
,其行为有点像php函数内爆,例如在“字符串”之间放置分隔符“,”。
例如如果你打电话:
concat(b, "a") ===> "a"
concat(b, "a", "b") ===> "a,b"
concat(b, "a", "b", "c") ===> "a,b,c"
这可以通过折叠参数包来完成吗?
您可以将包装拆开,以便能够在琴弦之间插入
,
:
template<class T, class ...Ts>
std::string_view concat(std::string buffer, T&& t, Ts&&...ts){
buffer.clear();
buffer.append(std::forward<T>(t));
((buffer.append(","),
buffer.append(std::forward<Ts>(ts))), ...);
return buffer;
}