【问题标题】:How to write a function which accepts variable number of char array arguments in c++? [duplicate]如何在 C++ 中编写一个接受可变数量的 char 数组参数的函数? [复制]
【发布时间】:2013-05-30 17:17:54
【问题描述】:

我现在有

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

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/1657883/… 它涵盖了 C++ 和 C++11 以及可变数量的相同和不同参数。
  • 您是在寻求一种方法来接受可变数量的任何类型的参数,或者特别是是否有一种方法只接受可变数量的字符串?
  • 仅适用于字符串....我的意思是 char 数组 - "string1"
  • c++11(特别是可变参数模板)适合你吗?
  • 为什么不简单地使用字符串向量?

标签: c++ string


【解决方案1】:

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

【讨论】:

  • 对不起,我写了字符串...我的意思是 char 数组
  • 字符串类有一个构造函数,它接受一个字符数组。字符串str(chararray);
【解决方案2】:

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

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

这是一个更冗长的机器人,所以你可以推出一个便利功能,但这必须依赖于 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&lt;&lt;:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 该问题答案中的 C-varargs 不适用于 C++ 字符串。
    • 哎呀,你是对的,我想我已经很久没有真正写过 C++ 代码了。我的坏。
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2021-03-07
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2014-12-13
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多