2

まず、私は最も有能なC ++プログラマーではありませんが、Thriftの力を学び、楽しんでいます。

void、i32、およびlistを返すいくつかの基本関数を使用してThriftServiceを実装しました。Django Webアプリによって制御されるPythonクライアントを使用してRPC呼び出しを行っていますが、これは非常にうまく機能します。生成されたコードは、リストの戻り値を除いて、非常に単純です。

.thrift記述ファイル:

namespace cpp Remote

enum N_PROTO {
        N_TCP,
        N_UDP,
        N_ANY
}

service Rcon {
    i32 ping()
    i32 KillFlows()
    i32 RestartDispatch()
    i32 PrintActiveFlows()
    i32 PrintActiveListeners(1:i32 proto)
    list<string> ListAllFlows()
}

Rcon.hから生成された署名:

  int32_t ping();
  int32_t KillFlows();
  int32_t RestartDispatch();
  int32_t PrintActiveFlows();
  int32_t PrintActiveListeners(const int32_t proto);
  int64_t ListenerBytesReceived(const int32_t id);
  void ListAllFlows(std::vector<std::string> & _return);

ご覧のとおり、生成されたListAllFlows()関数は、文字列のベクトルへの参照を取ります。.thriftの説明にあるように、文字列のベクトルを返すことを期待していると思います。

関数に変更する文字列のベクトルを提供することを意図しているかどうか疑問に思っています。そうすると、関数がvoidを返しても、Thriftがそれをクライアントに返す処理を行います。

C++でのThriftlist<>タイプのリソースや使用例はまったく見つかりません。任意のガイダンスをいただければ幸いです。

4

2 に答える 2

3

わかりました、私はそれを理解しました。それは本当にとても簡単です。

void ListAllFlows(std::vector<std::string> & _return)
{
    for(int x = 0; x < 5; x++)
    {
        _return.push_back(std::string("hi"));
    }
}

次に、Python クライアントは、.thrift ファイルにあるようにそれを呼び出します。

result = client.ListAllFlows()
print result # ['hi', 'hi', 'hi', 'hi', 'hi']
于 2012-10-11T17:21:04.797 に答える
0

コンテナー クラスを直接返すことは機能しますが、ここで詳しく説明するいくつかの欠点があります。

于 2014-03-27T18:12:26.843 に答える