我喜欢新自动生成的大括号封装初始化器!
如果我开始宣布自己的构造函数,有什么方法可以避免丢失它们吗?
代码
#include <string>
struct Foo
{
int i;
std::string s;
// Foo() { } // I lose my brace-enclosed initializers if I uncomment this line
};
int
main( int argc, char* argv[] )
{
Foo f{ 1, "bar" }; // having the option to do this is good
return 0;
}
ANSWER
根据juanchopanza's answer below,看来我必须满足aggregates的冗长规则。但我仍然需要一个解决方案,我可以应用于50多个ORM类(大多数每个5-15个字段),不需要大量的锅炉板代码,或者如果有锅炉板代码,至少它应该易于编辑/维护。
我能得到的最接近的是使用构图的解决方案。我想知道是否有更好/更简单的东西......
#include <string>
// this class must satisfy the rules for aggregates
struct Foo_
{
int i;
std::string s;
};
// this class can be anything...
struct Foo
{
Foo_ m_f;
Foo( Foo_ const& f ) : m_f( f ) { }
};
int
main( int argc, char* argv[] )
{
Foo f( { 1, "bar" } ); // ugly, but works
return 0;
}
答案 0 :(得分:7)
您无法避免丢失自动聚合初始化,因为您的类不再是聚合。但是您可以添加一个带有两个参数的构造函数,并从非聚合的聚合初始化中受益:
struct Foo
{
int i;
std::string s;
Foo(int i, const std::string& s) : i(i), s(s) {}
Foo() = default; // idiomatic C++11
};