C++ 节俭中的Union显示c+中设置的所有值+;

C++ 节俭中的Union显示c+中设置的所有值+;,c++,thrift,C++,Thrift,我做了一个三个字段的简单并集 union example{ 1:string STRING, 2:i64 INT64, 3:double DOUBLE } 我将客户机中的示例联合实例化为: example ex; ex.__set_STRING("Example"); ex.__isset.STRING = true; 并通过接受示例作为参数的方法发送示例 在服务器中,调用的方法如下所示: void get(const example &ex) {

我做了一个三个字段的简单并集

union example{
    1:string STRING,
    2:i64 INT64,
    3:double DOUBLE
}
我将客户机中的示例联合实例化为:

example ex;
ex.__set_STRING("Example");
ex.__isset.STRING = true;
并通过接受示例作为参数的方法发送示例

在服务器中,调用的方法如下所示:

void get(const example &ex)
  {
    cout << ex.__isset.STRING << ' ' << ex.__isset.INT64 << ' ' <<
        ex.__isset.DOUBLE << endl;
    cout << ex << endl;
  }
我不知道这是否是设置联合类型的正确方法,但我尝试了几种组合,似乎都不起作用

可以在以下位置找到代码段的源代码:

看起来像是工会的问题。这些值是无条件写入的,whcih适用于
struct
,但不适用于
union
。因此,解决方法是添加一个显式的
可选

union type_ex
{
    1 : optional string STRING,
    2 : optional i64 INT64,
    3 : optional double DOUBLE
}
这给了我们:

uint32_t type_ex::write(::apache::thrift::protocol::TProtocol* oprot) const {
  uint32_t xfer = 0;
  apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);
  xfer += oprot->writeStructBegin("type_ex");

  if (this->__isset.STRING) {
    xfer += oprot->writeFieldBegin("STRING", ::apache::thrift::protocol::T_STRING, 1);
    xfer += oprot->writeString(this->STRING);
    xfer += oprot->writeFieldEnd();
  }
  if (this->__isset.INT64) {
    xfer += oprot->writeFieldBegin("INT64", ::apache::thrift::protocol::T_I64, 2);
    xfer += oprot->writeI64(this->INT64);
    xfer += oprot->writeFieldEnd();
  }
  if (this->__isset.DOUBLE) {
    xfer += oprot->writeFieldBegin("DOUBLE", ::apache::thrift::protocol::T_DOUBLE, 3);
    xfer += oprot->writeDouble(this->DOUBLE);
    xfer += oprot->writeFieldEnd();
  }
  xfer += oprot->writeFieldStop();
  xfer += oprot->writeStructEnd();
  return xfer;
}

.

示例ex之后
try
memset(&ex,0,sizeof(ex))或手动设置
\uuuu isset.INT64=\uuuuu isset.DOUBLE=false已经尝试过,不起作用:/请发布thrift为客户端和服务器端序列化生成的代码。我刚刚将此代码附加到教程cpp代码中。这个问题很容易重现。
union type_ex
{
    1 : optional string STRING,
    2 : optional i64 INT64,
    3 : optional double DOUBLE
}
uint32_t type_ex::write(::apache::thrift::protocol::TProtocol* oprot) const {
  uint32_t xfer = 0;
  apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);
  xfer += oprot->writeStructBegin("type_ex");

  if (this->__isset.STRING) {
    xfer += oprot->writeFieldBegin("STRING", ::apache::thrift::protocol::T_STRING, 1);
    xfer += oprot->writeString(this->STRING);
    xfer += oprot->writeFieldEnd();
  }
  if (this->__isset.INT64) {
    xfer += oprot->writeFieldBegin("INT64", ::apache::thrift::protocol::T_I64, 2);
    xfer += oprot->writeI64(this->INT64);
    xfer += oprot->writeFieldEnd();
  }
  if (this->__isset.DOUBLE) {
    xfer += oprot->writeFieldBegin("DOUBLE", ::apache::thrift::protocol::T_DOUBLE, 3);
    xfer += oprot->writeDouble(this->DOUBLE);
    xfer += oprot->writeFieldEnd();
  }
  xfer += oprot->writeFieldStop();
  xfer += oprot->writeStructEnd();
  return xfer;
}