2012-10-10 2 views
2

우선, 나는 가장 유능한 C++ 프로그래머는 아니지만, 배우고 있고, Thrift의 힘을 즐기고 있다고 말할 것입니다.Apache Thrift 처리하기 C++의 리턴 타입

void, i32 및 list를 반환하는 몇 가지 기본 함수를 사용하여 Thrift 서비스를 구현했습니다. 장고 웹 응용 프로그램에서 제어하는 ​​Python 클라이언트를 사용하여 RPC 호출을 작성하고 있는데 꽤 잘 작동합니다.

.thrift 설명 파일 : Rcon.h에서

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() 
} 

생성 된 서명 :

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를 반환하는 함수에도 불구하고이를 클라이언트에 반환하는 것을 처리하는지 궁금합니다.

C++에서 쓰레드 목록 <> 유형의 자원이나 예제 사용법을 찾을 수 없습니다. 모든 지침을 부탁드립니다.

답변

3

좋아, 알아 냈어. 정말 간단합니다.

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

그것이 .thrift 파일에 보이는 그런 파이썬 클라이언트는 단지 그것을 호출 컨테이너 클래스를 반환

result = client.ListAllFlows() 
print result # ['hi', 'hi', 'hi', 'hi', 'hi'] 
0

직접 작동하지만 더 자세히 over here에 설명 된 몇 가지 단점이 있습니다.