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

时间:2013-05-30 17:17:55

标签: c++ string

我目前有

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()方法

3 个答案:

答案 0 :(得分:5)

如果你只是接受字符串,只需使用字符串向量。解析方法中的向量。根据您的问题,似乎不需要变量参数。

答案 1 :(得分:1)

由于您显然只需要可转换为字符串的字符串和字符数组,因此您只需要可变数量的字符串参数。

首先想到的是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?"));
03 中的

您既没有可变参数模板也没有初始化列表。但你有boost.assign:

#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()返回对该对象的引用。最后,由于write()只接受字符串而不接受ToChatMessage类型的对象,因此通过调用operator string()将该对象转换为字符串,从而将字符串向量传递给to_chat_message

您可以使用其他运算符,而不是重载operator(),具体取决于您希望调用的内容,例如: operator<<

write(ToChatMessage() << "hey" << " " << "hey" << str << "what?" );

当然有可能通过接受一个到N个参数来重载to_chat_message,但这意味着你要么必须手动重复大部分相同的东西N次,你还是要使用预处理器魔法像Boost.Preprocessor一样,创建一个难以理解,难以维护和不可破坏的混乱定义所有这些重载。

答案 2 :(得分:0)

您需要使用标准的C / C ++方法将可变数量的参数传递给函数。正如Shafik所说,你应该看看"Variable Number of Arguments in C"接受的答案应该包含你需要的所有信息。