如何避免丢失自动生成的初始化列表构造函数?

时间:2012-12-20 20:46:08

标签: c++ c++11 initializer-list

我喜欢新自动生成的大括号封装初始化器!

如果我开始宣布自己的构造函数,有什么方法可以避免丢失它们吗?

代码

#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;
}

1 个答案:

答案 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
};