Блог пользователя yermak0v

Автор yermak0v, 10 лет назад, По-русски

Всем привет.
Мне как программисту на С++ с некоторым, но таки, стажем стало интересно немного разобраться в ООП. Но сейчас не об этом.
Можно ли как-то создать такую функцию, которая для каждой переменной могла бы сказать ее идентификатор?
Магическим образом решение было найдено:

#define id(x) #x  

Но при чем тут ООП? Вот при чем: допустим у нас есть класс Point в котором есть координаты x и y. Можно ли как-нибудь написать метод внутри этого класса который возращал бы идентификатор объекта и его x и y?
UPD. макрос id работает поистине магически. Код cout << #x; не работает, тогда как c макросом все в норме.

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится

Думаю, что нет, нельзя. Только макросами.

Причина: имена переменных с концами умирают на этапе компиляции. А вы хотите их оставить. Значит, нужно их как-то в строки превращать. Либо руками, либо макросами, которые это умеют.

Более глубокая причина: если класс у вас объявлен в другом файле, то он тем более ничего не знает про те места, из которых будет вызываться. Поэтому, чтобы сделать такую функцию методом класса, надо в неё явно передавать имя переменной. Опять же — либо руками, либо макросами.

А #x — это, действительно, чисто макроконструкция, это не оператор языка. Поэтому работает только в макросах, при их разворачивании.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Вообще понятие идентификатор для объекта вещь довольно странная.

Например я бы не ожидал, что в коде

    const T& x = some_val;
    const T& y = x;
    y.gimmename();

замена y на x в последней строке что-то меняла ибо это один и тот же объект.