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。
我正在使用 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。