Thrift 生成结构的 C++ 大括号初始化

C++ Brace Initialization for Thrift-Generated Structures

我正在使用 Thrift w/C++,它会生成许多具有构造函数的结构,如下所示:

struct ThriftColor
{
  ThriftColor(const ThriftColor&);
  ThriftColor& operator=(const ThriftColor&);
  ThriftColor() : color((ZColor::type)0), duration(0) { }

  ZColor::type color;
  int32_t duration;
};

我还没弄清楚如何支撑初始化它。

我得到的错误是:

error: could not convert '{RED, 1000}' from '<brace-enclosed initializer list>' to 'ThriftColor'

或者当使用矢量时:

error: could not convert '{{RED, 1000}, {GREEN, 2000}}' from '<brace-enclosed initializer list>' to 'std::vector<ThriftColor>'

相似形式的结构,作品:

struct TimedColor
{
    TimedColor(ZColor::type c, int d) : color(c), duration(d) {}
    ZColor::type color;
    int duration;
};

有没有办法让Thrift生成一个可以用大括号初始化的结构? And/or: 有没有办法用括号初始化第一个结构?

提前致谢!

完整示例: http://cpp.sh/3wgq

// Example program
#include <iostream>
#include <string>
#include <vector>

struct ZColor {
enum type {
    OFF,
    RED,
    GREEN,
    YELLOW,
    BLUE,
    MAGENTA,
    CYAN,
    WHITE
};
};


struct TimedColor
{
    TimedColor(ZColor::type c, int d) : color(c), duration(d) {}
    ZColor::type color;
    int duration;
};

struct ThriftColor
{
  ThriftColor(const ThriftColor&);
  ThriftColor& operator=(const ThriftColor&);
  ThriftColor() : color((ZColor::type)0), duration(0) { }

  ZColor::type color;
  int32_t duration;
};

template<typename T>  
void Dump( std::vector<T>& vec)
{
    for(typename std::vector<T>::iterator it = vec.begin(); it != vec.end(); it++)
    {
        std::cout << it->color << ":" << it->duration << std::endl;
    }
}

void TestFunction1()
{
    std::vector<TimedColor> vec;
    vec.push_back(TimedColor(ZColor::RED,1000));
    vec.push_back(TimedColor(ZColor::GREEN,2000));
    Dump(vec);    
}

void TestFunction2()
{
    std::vector<TimedColor> vec = { { ZColor::RED, 1000 }, { ZColor::GREEN, 2000 } };
    Dump(vec);    
}

void TestFunction3()
{
    // fails
    ThriftColor tc =  { ZColor::RED, 1000 };
    std::vector<ThriftColor> vec = { { ZColor::RED, 1000 }, { ZColor::GREEN, 2000 } };
    Dump(vec);    
}

int main()
{
  TestFunction1();
  TestFunction2();
  TestFunction3();
}

如果ThriftColor没有双参数构造函数,那么两个参数的初始化列表是无用的。

你能不能为此添加一个合适的构造函数

ThriftColor(ZColor::type color, int32_t duration) : color(color), duration(duration) {};

(或者是否有一些自动生成的东西可以消除它?对 Thrift 了解不多。)

事实证明,目前无法生成可使用 Thrift 进行大括号初始化的复杂结构。经过进一步考虑,这可能是一件好事,因为 Thrift 生成了用于设置结构成员的方法,这些方法跟踪是否设置了可选字段。例如,Thrift 可能会生成:

void ThriftColor::__set_duration(const int32_t val) {
  this->duration = val;
__isset.duration = true;
}

生成一个能够从大括号初始化正确设置内部 __isset 结构的重要结构将相当复杂。

最后,我创建了一个辅助函数来为我初始化 ThriftColor 向量并使用它们构建 ThriftObject。