如何在 C++ 中为任意数量的字符串串联编写可变参数函数

how to write variadic function for any number of string concatenation in c++

本文关键字:函数 参数 变参 字符串 C++ 任意数      更新时间:2023-10-16

我是 c++ 的新手。我知道这是一个非常普遍的问题,但我想要一个完整的代码来连接传递给 c++ 函数的任意数量的字符串。我调用该函数为:

string var1,var2;
var1=concat_string("one","two");
cout<<var1<<endl;
var2=concat_string("one","two","three");
cout<<var2<<endl;

我所需的输出是:

onetwo
onetwothree

我已经阅读了有关可变参数函数的信息,但是我尝试了以下代码来连接字符串,而不必担心字符串参数的结果大小和数量。我的代码是:

#include <cstdarg>
template<typename... T>
string concat_string(T const&... t){
std::stringstream s;
s<<t;
return s;
}

但是我在这个代码中遇到了很多错误。如何更正我的代码。谢谢。。

在 C++17 中,使用折叠表达式,它将是

template<typename... Ts>
string concat_string(Ts const&... ts){
std::stringstream s;
(s << ... << ts);
return s.str();
}

以前(但从 C++11 开始(,您必须依靠一些技巧来获得有效的扩展上下文,例如:

template<typename... Ts>
string concat_string(Ts const&... ts){
std::stringstream s;
int dummy[] = {0, ((s << ts), 0)...};
static_cast<void>(dummy); // Avoid warning for unused variable
return s.str();
}

由于看起来您正在学习 C++11,因此以下是 @Jarod42 支持完美转发的出色解决方案的一个小扩展:

template <typename... T>
std::string concat_string(T&&... ts) {
std::stringstream s;
int dummy[] = { 0, ((s << std::forward<T>(ts)), 0)... };
static_cast<void>(dummy); // Avoid warning for unused variable
return s.str();
}

完美的转发和右值引用是 C++11 中的另一个功能,可以提高性能。