Инициализация временного агрегатного объекта с использованием фигурных скобок - PullRequest
5 голосов
/ 06 октября 2009

Допустим, у меня есть класс:

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 ]

8 голосов
/ 06 октября 2009

То, что вы хотите, возможно с помощью списков инициализаторов 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 вам придется писать и вызывать конструктор.

3 голосов
/ 06 октября 2009

Сейчас это невозможно. В связи с этим новый стандарт C ++ 0x ввел концепцию списков инициализаторов и Uniform_initialization .

1 голос
/ 06 октября 2009

"Существует много решений, но мне просто любопытно, можно ли достичь этой цели с помощью фигурных скобок." Не возможно. Если вы не можете изменить источник, тогда единственные варианты - заключить его во встроенную функцию или вспомогательную структуру:

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 : удалено несоответствующее решение конструктора.

...