如何在c++中编写一个接受可变数量的char数组参数的函数
How to write a function which accepts variable number of char array arguments in c++?
我目前有
std::stringstream ss;
ss << "hey"<<" "<< "hey"<<" "<< "hey"<<" "....// here I want to be able to pass different kinds of messages
std::string s(ss.str());
write(to_chat_message(s));
我想在写入函数之前将该部分转换为函数,这样我就可以简单地执行write(to_chat_message("hey"," ","hey"," ","hey"," ",...));
我应该如何编写这个新的重载to_chat_message()
方法
如果只接收字符串,只需使用字符串向量。分析方法中的向量。根据你的问题,似乎不需要可变的论据。
由于您显然只需要可转换为字符串的字符串和char数组,因此您只需要可变数量的字符串参数。
首先想到的是std::vector
。
std::string to_chat_message(std::vector<std::string> v) {
//do something with the strings in v...
}
在C++11中
这可以很容易地与初始值设定项列表一起完成:
//...
string str{"meh"};
write(to_chat_message({"hey", " ", "hey", str, "what?"}));
为了方便起见,为了去掉花括号,您可以编写一个可变模板:
template <class... Args>
std::string to_chat_message(Args&&... args) {
return to_chat_message({ std::forward<Args>(args)... });
}
// and now...
write(to_chat_message("hey", " ", "hey", str, "what?"));
在C++03中
您既没有可变模板,也没有初始值设定项列表。但你有助推器。分配:
#include <boost/assign/list_of.hpp>
using boost::assign::list_of;
write(to_chat_message(list_of<std::string>("hey")(" ")("hey")(str)("what?")));
这是一个更详细的机器人,所以你可以滚动一个方便功能,但这必须依赖于list_of
:的细节实现
boost::assign::assign_detail::generic_list<std::string> sl(std::string const& str)
{ return boost::assign::list_of(str); }
write(to_chat_message(sl("hey")(" ")("hey")(str)("what?")));
或者你推出自己的实现,只是为了这个目的:
struct ToChatMessage {
std::vector<std::string> strings;
ToChatMessage(std::string const& str) {strings.push_back(str);}
operator std::string() const { return to_chat_message(strings); }
ToChatMessage& operator()(std::string const& str) {
strings.push_back(str);
return *this;
}
};
write(ToChatMessage("hey")(" ")("hey")(str)("what?"));
这主要是list_of
所做的:使用最左边的调用(构造函数(创建一个包含字符串向量的对象,并将第一个参数推入该向量。其他调用(operator()
(将更多的值推送到向量中。由于operator()
返回对对象的引用,因此可以将thise调用链接起来。最后,由于write()
只接受字符串,而不接受类型为ToChatMessage
的对象,因此通过调用operator string()
并将字符串的矢量传递给to_chat_message
,将该对象转换为字符串。
您当然可以使用其他运算符,而不是重载operator()
,这取决于您希望调用的样子,例如operator<<
:
write(ToChatMessage() << "hey" << " " << "hey" << str << "what?" );
当然,也有可能通过接受N个参数中的一个来重载to_chat_message
,但这意味着你要么必须手动重复相同的内容N次,要么你必须使用Boost.preprocessor之类的预处理器魔法,并在所有这些重载中创建一个不可读、难以维护和不可调试的混乱定义。
您需要使用标准的C/C++方法,将可变数量的参数传递给函数。正如Shafik所提到的,你应该看看"C中的变量数量"。公认的答案应该包含你需要的所有信息。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 估计函数参数数组的维度
- 温度参数数组的内存泄漏
- 如何将值附加到命令行参数数组?
- libpqxx:如何绑定参数数组
- 如何在德尔福中C++参数数组指针算术
- C++函数参数或参数数组
- 将 std::function 代理为需要参数数组的 C 函数
- 分析字符串参数数组
- Pro*C传递参数数组
- OpenCV错误:cvGetSize中的错误参数(数组应该是CvMat或IplImage)
- c++无限参数数组
- 查找命令行参数数组中的元素数
- 如何将目录中所有具有完整路径的文件传递到execv中的参数数组
- ODBC:参数数组-忽略参数
- 使用lambda参数数组