以特定方式展开和折叠参数包

问题描述 投票:0回答:1
#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"

这可以通过折叠参数包来完成吗?

templates c++17
1个回答
0
投票

您可以将包装拆开,以便能够在琴弦之间插入

,

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.