【问题标题】:Handling variable data using << operator使用 << 运算符处理变量数据
【发布时间】:2013-08-03 11:05:04
【问题描述】:

我有一段用于向远程端发送数据的代码,它的行为有点像picojson,例如:

server::value::object obj;
obj["cmd"] = server::value("test");
obj["url"] = server::value(url);
...
obj["code"] = server::value(std::to_string(code));

server::value v(obj);
client.send_to_server(v.process());

只要有东西要发送,就会有这样的块。

这些行在我的项目中有很多地方使用,我正在考虑使用函数或

Data d << "cmd" << "test"
       << "url" << url
       << ... << ...
       << "code" << code;
client.send_to_server(d);

这样做是个好主意吗?如何实现?

谢谢。

【问题讨论】:

  • 我给你一个提示:Data&amp; operator&lt;&lt;(Data&amp; data, const std::string&amp; str); 用于字符串。
  • 几天前我也问过同样的问题;看看this solution 是否符合您的需要。我也在计划编写一个序列化程序。 (:

标签: c++ operator-overloading iostream


【解决方案1】:

我会写不同的:

d << add_value("cmd", "test")
  << add_value("url", url)
  << add_value(..., ...)
  << add_value("code", code)
  ;

为什么?它更清晰,可以更好地控制类型。

所以你创建了一个类,比如说__add_value_temp,它包含名称和值,一个函数add_value 创建这个类,然后编写一个

Data &operator<<(Data &d, const __add_value_temp &val){
  d.add(val.name,val.val);
  return d;
}

更好的是 - 您可以使用 std::pair 代替 __add_value_temp,并使用 std::make_pair 代替 add_value

Data &operator<<(Data &d, const std::pair<std::string,std::string> &val){
  d.add(val.first,val.second);
  return d;
}

...
Data d;
d << std::make_pair("cmd", "test")
  << std::make_pair("url", url)
  << std::make_pair(..., ...)
  << std::make_pair("code", code)
  ;

(最后一点:在pair 的类型上编写模板化operator&lt;&lt; 可能很聪明,这样您就可以通过引用传递东西,并且通常可以避免不必要的复制)

【讨论】:

  • 顺便说一句 - 在一行之后写 ; 有助于复制/粘贴各种值,并允许轻松注释行(例如最后一行)。
【解决方案2】:

设计这样的 API 不是一个好主意,因为它极易出错。

一个看似相似的想法适用于输出流,原因很简单:您放入流中用于输出的数据得到统一处理。您作为参数放入 &lt;&lt; 的任何内容都将成为输出的一部分,除了流操纵器,它控制输出的呈现方式。

您的 API 不同:奇数项与偶数项的处理方式不同。此外,发送奇数个操作数也是错误的。如果由于某种原因您忘记将字符串代码放在其中一行上,所有值都会默默地变成后续行上的代码。这样的 API 非常脆弱,所以我强烈推荐它。

我认为让用户成对添加项目的 API 会更好。如果你的编译器是 C++11 兼容的,你也可以使用uniform initialization 语法:

Data d = {
    {"cmd", server::value("test")}
,   {"url", server::value(url)}
,   {"code", server::value(std::to_string(code))}
};

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 2023-03-09
    • 1970-01-01
    • 2017-02-27
    • 2020-10-14
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多