C ++, как компилятор синтезирует конструктор копирования по умолчанию - PullRequest
0 голосов
/ 22 февраля 2012

Конструктор копирования по умолчанию, который синтезируется компилятором для класс, который не определяет свой собственный, делает правильную вещь: он копирует все члены от одного объекта к другому.

Я хочу сделать что-то подобное. Я хочу написать метод

template <typename T>
T f(const T& obj) {
 // for each member var i of obj, I want to call some method g(obj.i)
}

Теперь я не знаю, как называются переменные-члены. Если это было конструктор копирования, я мог бы вызвать оператор присваивания вместо g.

Ясно, что компилятор делает это (но, возможно, он делает это после того, как сделал вывод Имя членов класса). Возможно ли это сделать? для любого класса Т?

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Компилятор имеет некоторую внутреннюю структуру данных, представляющую каждый класс. Когда дело доходит до синтеза конструктора копирования, он может ссылаться на эту структуру, чтобы выяснить, какой код ему нужно выдать (сколько копий, как делается каждая и каковы адреса членов по отношению к источнику и адрес объекта назначения).

Как простой программист на C ++, у вас нет доступа к этой внутренней структуре данных времени компиляции, так что вам почти не повезло. Вы в основном должны перечислить участников и надеяться, что вы не пропустите никого.

Возможно, вы могли бы поработать с препроцессором (или, если нет, препроцессором , то a препроцессором), чтобы аннотировать определение структуры дополнительной информацией, которую вы можете использовать для генерации списка одного звонка для каждого участника.

0 голосов
/ 22 февраля 2012

Нет, вы не можете этого сделать. C ++ не имеет отражения метода , хотя вы можете сделать это, работая в рамках, подобных Qt. (Кстати, это отличный фреймворк, я использую его все время, и он обеспечивает только тонкий слой бумаги поверх C ++.) Компилятору это тоже не нужно делать, то есть не нужно сделать вывод имена членов. Он просто знает смещение в памяти от адреса объекта и типа каждого члена и копирует их в целевой объект, вызывая их конструкторы.

...