2009-10-06 160 views
5
初始化臨時聚合對象

比方說,我有一個類:使用大括號

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). 

我還可以創建一個對象,然後將其作爲參數傳遞,等等,等等

解決方法有很多,但我我只是好奇,如果有可能實現這個目標使用大括號初始化。

+0

呃......如果你沒有訪問標題,你不能假定對象可以使用大括號初始化,可以嗎? – unwind 2009-10-06 12:36:44

+3

實際上,makeXXX方法並沒有那麼糟糕。最近的編譯器能夠應用NRVO(命名的返回值優化),從而導致高效的代碼。當應用NRVO並且內聯函數時,就效率而言,這相當於C++ 0x語法。 – sellibitze 2009-10-06 13:14:20

回答

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

「有很多解決方案,但我只是好奇如果可以使用大括號初始化來實現這個目標。」

不可能。如果你不能改變源那麼你唯一的選擇是包裝在一個內聯函數或輔助結構:

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

frobnicate(AggregateHelper(1500,2900)); 

編輯:去除不相關的構造解決方案。

+0

但是,這也會將類型的屬性從聚合(以及本例中的POD)更改爲非聚合。這可能不會被期望,並且它需要搜索並替換所有以前的{}初始化。 – 2009-10-06 12:53:02