4

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

如果我开始声明自己的构造函数,有什么办法可以避免丢失它们?

代码

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

回答

根据下面 juanchopanza 的回答,看来我必须满足聚合的冗长规则。但我仍然需要一个可以应用于 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;
}
4

1 回答 1

7

您无法避免丢失自动聚合初始化,因为您的类不再是聚合。但是您可以添加一个带有两个参数的构造函数,并从非聚合的聚合初始化中受益:

struct Foo
{
    int          i;
    std::string  s;
    Foo(int i, const std::string& s) : i(i), s(s) {}
    Foo() = default; // idiomatic C++11
};
于 2012-12-20T20:48:21.007 回答