1

我目前有

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

4

3 回答 3

5

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

于 2013-05-30T17:27:48.780 回答
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?"));

在 C++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?")));

那是一个更冗长的机器人,所以你可以推出一个便利功能,但这必须依赖于 boosts 的详细实现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()) 将更多值推入向量中。您可以链接 thise 调用,因为它operator()返回对对象的引用。最后,由于write()只接受字符串而不接受类型ToChatMessage的对象,因此该对象通过调用转换为字符串operator string(),从而将字符串向量传递给to_chat_message.

除了重载operator(),您当然可以使用其他运算符,具体取决于您希望调用的外观,例如operator<<

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

当然to_chat_message,接受一个到 N 个参数可能会导致过载,但这意味着您要么必须手动重复几乎相同的东西 N 次,否则您将不得不使用像 Boost.Preprocessor 之类的预处理器魔法并创建一个不可读的,难以维护和不可调试的混乱定义所有这些重载。

于 2013-05-31T06:46:32.583 回答
0

您将需要使用标准 C/C++ 方法将可变数量的参数传递给函数。正如 Shafik 提到的,您应该查看“C 中的可变参数数量” 接受的答案应该包含您执行此操作所需的所有信息。

于 2013-05-30T17:30:29.497 回答