我目前有
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()
方法
答案 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?"));
您既没有可变参数模板也没有初始化列表。但你有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"接受的答案应该包含你需要的所有信息。