2009-10-06 14 views
5

Powiedzmy mam klasy:Inicjowanie tymczasowy łączną obiektu za pomocą nawiasów klamrowych

class Aggregate { 

public: 

    int x; 
    int y; 

}; 

wiem jak zainicjować obiektu przy użyciu nawiasów klamrowych:

Aggregate a1 = { 1500, 2900 }; 

Ale nie mogę znaleźć właściwego Składnia do utworzenia obiektu tymczasowego i przekazanie go jako argumentu do pewnej metody, na przykład:

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

//... 

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

Najprostszy sposób byłoby dodać konstruktor do klasy Aggregate, ale załóżmy, że nie mam dostępu do nagłówka Aggregate. Innym pomysłem byłoby napisać jakieś metody fabryki, tj

Aggregate makeAggregate(int x, int y). 

mogę również utworzyć obiekt, a następnie przekazać go jako argument itp itd

Istnieje wiele rozwiązań, ale I” Jestem ciekawy, czy można osiągnąć ten cel za pomocą inicjalizacji nawiasów klamrowych.

+0

Uh ... Jeśli nie masz dostępu do nagłówka, nie możesz zakładać, że obiekt można zainicjować za pomocą nawiasów klamrowych w ogóle, prawda? – unwind

+3

Podejście makeXXX nie jest tak złe. Najnowsze kompilatory są w stanie zastosować NRVO (zwaną optymalizacją wartości zwracanej), co prowadzi do wydajnego kodu. Kiedy zostanie zastosowane NRVO, a funkcja zostanie wstawiona, będzie to równoznaczne ze składnią C++ 0x pod względem wydajności. – sellibitze

Odpowiedz

8

Co jest możliwe z listami inicjalizującymi C++ 0x.

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

void frobnicate(const Aggregate& arg) { 

} 

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

GCC 4.4 obsługuje już to z flagą -std=c++0x. Być może VS2010 CTP również to obsługuje (popraw mnie, jeśli się mylę).

W C++ 98/C++ 03 będziesz musiał napisać i wywołać konstruktora.

1

"Istnieje wiele rozwiązań, ale jestem ciekawy, czy uda się osiągnąć ten cel za pomocą inicjalizacji nawiasów klamrowych."

Niemożliwe. Jeśli nie można zmienić źródło wtedy jedynymi opcjami są do zawijania, że ​​w funkcji wbudowanych lub struct pomocnika:

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

frobnicate(AggregateHelper(1500,2900)); 

edit: usunięte bez znaczenia rozwiązanie konstruktor.

+0

Zmienia jednak także właściwość typu z Aggregate (a także POD w tym przypadku) na non-aggregate. Nie można tego oczekiwać i wymagałoby to przeszukania i zamiany dla wszystkich wcześniejszych {} inicjalizacji. –

Powiązane problemy