[ https://issues.apache.org/jira/browse/THRIFT-1712?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Martin Vogt updated THRIFT-1712: -------------------------------- Description: The generated c++ classes for struct's do not have a common base class. The patch adds two options to the compiler: - line_first : first line before all includes - base_struct : custom base class for structs For example: {code:title=MyService.thrift} struct MyStruct { 1:i32 val; } service MyService { void doSomething(); } {code} thrift --gen cpp:line_first='#include <path/TBase.h>',base_struct=':public TBase' ./MyService.thrift {code:title=MyService_types.h} #ifndef MyService_TYPES_H #define MyService_TYPES_H #include <path/TBase.h> #include <thrift/Thrift.h> [....] class MyStruct:public TBase { [...] {code} The default, without any option: thrift --gen cpp ./MyService.thrift {code:title=MyService_types.h} #ifndef MyService_TYPES_H #define MyService_TYPES_H /* first line (modifier:off) */ #include <thrift/Thrift.h> [....] class MyStruct /* base_struct (modifier:off) */ { [... {code} The idea is to have a base class for typecasting, which can be done with: {code} void processSignal(const TBase& tBase) { if (typeid(tBase).name() == typeid(MyStruct).name()) printf("MyStruct found!\n") {code} was: The generated c++ classes for struct's do not have a common base class. The patch adds a "base_struct" option to the compiler: - thrift --gen cpp:base_struct this will use a TBaseStruct in the thrift installation. Another option allows to replace the baseclass with an arbitrary one: -thrift --gen cpp:base_struct=MyBase,base_struct_inc=\\</path/MyBase.h\\>\n" With this it's possible to extend the TBaseStruct class in the thrift installation. I like to use this TBase class in QT, as a signal, for example: {quote} signals: void update(const TBase& tBase); {quote} And in the receiver slot I then can check which kind of message was send: {quote} // compare static pointers if (tBase.ascii_fingerprint == User::ascii_fingerprint) \{ User* user=(User*)&tBase; processUserMessage(user); \} {quote} > Add TBase class for c++ > ----------------------- > > Key: THRIFT-1712 > URL: https://issues.apache.org/jira/browse/THRIFT-1712 > Project: Thrift > Issue Type: New Feature > Components: C++ - Compiler > Affects Versions: 0.8 > Reporter: Martin Vogt > Assignee: Ben Craig > Priority: Minor > Labels: base, c++, class > > The generated c++ classes for struct's do not have a common base class. > The patch adds two options to the compiler: > - line_first : first line before all includes > - base_struct : custom base class for structs > For example: > {code:title=MyService.thrift} > struct MyStruct { > 1:i32 val; > } > service MyService { > void doSomething(); > } > {code} > thrift --gen cpp:line_first='#include <path/TBase.h>',base_struct=':public > TBase' ./MyService.thrift > {code:title=MyService_types.h} > #ifndef MyService_TYPES_H > #define MyService_TYPES_H > #include <path/TBase.h> > #include <thrift/Thrift.h> > [....] > class MyStruct:public TBase { > [...] > {code} > The default, without any option: > thrift --gen cpp ./MyService.thrift > {code:title=MyService_types.h} > #ifndef MyService_TYPES_H > #define MyService_TYPES_H > /* first line (modifier:off) */ > #include <thrift/Thrift.h> > [....] > class MyStruct /* base_struct (modifier:off) */ { > [... > {code} > The idea is to have a base class for typecasting, which can be done with: > {code} > void processSignal(const TBase& tBase) { > if (typeid(tBase).name() == typeid(MyStruct).name()) > printf("MyStruct found!\n") > > {code} -- This message was sent by Atlassian JIRA (v6.2#6252)