在C++中如何编写一个接受字符数组变量变量的函数?

在C++中如何编写一个接受字符数组变量变量的函数?,c++,string,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)); 我想把写之前的部分转换成一个函数,这样我就可

我现在有

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));
我想把写之前的部分转换成一个函数,这样我就可以简单地写聊天信息了


我应该如何编写这个新的重载到_chat_message方法

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

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

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

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

因为您显然只需要可转换为字符串的字符串和字符数组,所以您只需要可变数量的字符串参数

首先想到的是std::vector

为了方便起见,要去掉大括号,您可以编写一个可变模板:

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?"));
或者您推出自己的实现,只是为了这个目的:

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

当然,通过接受一到N个参数,可能会使聊天信息过载,但这意味着你要么必须手动重复几乎相同的内容N次,要么必须使用预处理器魔法,如Boost。预处理器,并创建一个不可读的,很难维护并且无法定义所有这些重载。

因为您显然只需要可转换为字符串的字符串和字符数组,所以只需要可变数量的字符串参数

首先想到的是std::vector

为了方便起见,要去掉大括号,您可以编写一个可变模板:

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?"));
或者您推出自己的实现,只是为了这个目的:

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

当然,通过接受一到N个参数,可能会使聊天信息过载,但这意味着你要么必须手动重复几乎相同的内容N次,要么必须使用预处理器魔法,如Boost。预处理器,并创建一个不可读的,难以维护和不可调试的混乱定义了所有这些重载。

这可能是有用的:它涵盖C++和C++ 11以及可变数量的相同和不同的参数。或者,特别是如果有一种方法只接受可变数量的字符串?只对字符串……我是指char数组——ScRun1+C++ 11个变量的模板,你可以选择一个选项吗?为什么不简单地使用一个字符串向量?这可能是有用的:它涵盖C++和C++ 11以及可变数量的相同和不同的参数。对于接受任何类型的变量数的方法,或者特别是如果有一种方法可以只接受可变数量的字符串?仅用于字符串…我是说字符数组-string1Is c++11特殊的可变模板是您的一个选项?为什么不简单地使用字符串向量?抱歉,我写了字符串…我的意思是字符数组字符串类有一个接受字符数组的构造函数。字符串str字符;对不起,我写了字符串…我的意思是char数组string类有一个接受char数组的构造函数。字符串str字符;这个问题的答案中的C-VARARGS不适用于C++字符串。OOP,你是正确的,我想这是我写C++代码以来的太长时间了。我的坏。这个问题的答案中的C-VARARGS不适用于C++字符串。OOP,你是正确的,我想这是我写C++代码以来的太长时间了。我的错。
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?"));
write(ToChatMessage() << "hey" << " " << "hey" << str << "what?" );