使用花括号初始化临时聚合对象

时间:2009-10-06 12:35:39

标签: c++ constructor initialization aggregate curly-braces

假设我有一个班级:

class Aggregate {

public:

    int x;
    int y;

};

我知道如何使用花括号初始化对象:

Aggregate a1 = { 1500, 2900 };

但是我找不到合适的语法来创建临时对象并将其作为参数传递给某个方法,例如:

void frobnicate(const Aggregate& arg) { 
    // do something
}

//...

frobnicate(Aggregate {1500, 2900}); // what should this line look like?

最简单的方法是将构造函数添加到Aggregate类,但我们假设我没有访问Aggregate头的权限。另一个想法是编写某种工厂方法,即

Aggregate makeAggregate(int x, int y).

我也可以创建一个对象,然后将其作为参数传递等等。

有很多解决方案,但我很好奇是否可以使用花括号初始化来实现这一目标。

3 个答案:

答案 0 :(得分:8)

使用C ++ 0x初始化列表可以实现所需。

class Aggregate {
public:
    int x, y;
};

void frobnicate(const Aggregate& arg) {

}

int main() {
    frobnicate({1, 2});
    return 0;
}

GCC 4.4已经通过-std=c++0x标志支持此功能。可能VS2010 CTP也支持这个(如果我错了,请纠正我。)

使用C ++ 98 / C ++ 03,您必须编写并调用构造函数。

答案 1 :(得分:3)

现在不可能。因此,新的标准C ++ 0x引入了Initializer listsUniform_initialization的概念。

答案 2 :(得分:1)

“有很多解决方案,但我很好奇是否可以使用花括号初始化来实现这个目标。”

不可能。如果您无法更改源代码,那么您唯一的选择是将其包装在内联函数或帮助程序结构中:

struct AggregateHelper
{
    Aggregate a;
    AggregateHelper(int x, int y) { a.x=x; a.y=y; }
    operator const Aggregate& () { return a; }
};

frobnicate(AggregateHelper(1500,2900));

编辑:删除了无关的构造函数解决方案。