0

リモート側にデータを送信するためのコードがあります。たとえば、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);

これは良い考えですか?それを実装する方法は?

ありがとう。

4

2 に答える 2

1

そのような API の設計は、非常にエラーが発生しやすいため、お勧めできません。

一見似たようなアイデアが出力ストリームでも問題なく機能しました。理由は単純です。出力用にストリームに入れるデータは一様に扱われるからです。出力の表示方法を制御するストリーム マニピュレータを除いて、引数として入力したもの<<はすべて出力の一部になります。

あなたの API は異なります: 奇数アイテムは偶数アイテムとは異なる方法で扱われます。さらに、奇数の合計オペランドを送るのは間違いです。何らかの理由で行の 1 つに文字列コードを配置するのを忘れた場合、すべての値が後続の行で黙ってコードになります。このような API は非常に壊れやすいため、再度使用することを強くお勧めします。

ユーザーがアイテムをペアで追加できる API の方がうまくいくと思います。コンパイラが C++11 に準拠している場合は、統一された初期化構文を使用することもできます。

Data d = {
    {"cmd", server::value("test")}
,   {"url", server::value(url)}
,   {"code", server::value(std::to_string(code))}
};
于 2013-08-03T11:16:28.517 に答える
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;
}

さらに良いことに、代わりに, を使用し、代わりに!を使用__add_value_tempできます。std::pairstd::make_pairadd_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)
  ;

operator<<(最後の注意:の型にテンプレート化されたものを書くのが賢明かもしれませんpair。これにより、参照によって物事を渡すことができ、一般的に不要なコピーを避けることができます)

于 2013-08-03T11:17:44.270 に答える