[
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)