如何在c++中编写一个接受可变数量的char数组参数的函数

How to write a function which accepts variable number of char array arguments in c++?

本文关键字:参数 数组 char 函数 一个 c++      更新时间:2023-10-16

我目前有

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中的变量数量"。公认的答案应该包含你需要的所有信息。