С++ эквивалент Python getattr

В python есть функция getattr, которая будет выглядеть так:

class MyObject():
    def __init__(self):
        self.xyz = 4

obj = MyObject()
getattr(obj, 'xyz')

где вызов getattr вернет 4.

Есть ли аналогичный способ сделать это на С++ (не Visual C++)?

Существуют ли какие-либо библиотеки с этой функциональностью, в которых я могу искать переменные-члены объекта с помощью строки?

Я пытаюсь найти способ поиска общедоступных данных в классе С++, который я не могу изменить. Поэтому я не могу использовать карту для сопоставления строковых литералов со значениями. Может быть, как «unstringify» с макросами?


person ulu5    schedule 01.05.2012    source источник
comment
См. здесь: stackoverflow .com/questions/41453/   -  person Andrew Lazarus    schedule 01.05.2012
comment
Ну, вы могли бы написать C/C++ и работать с виртуальной машиной python и создавать объекты python :) (шучу! шучу!)   -  person Not_a_Golfer    schedule 01.05.2012


Ответы (3)


То, о чем вы просите, обычно называют самоанализом.

Язык C++ сам по себе не поддерживает самоанализ. Вы можете подражать этому, но на этом все.

В предлагаемом вами API есть еще одна проблема: как бы вы сформулировали возвращаемый тип вашего метода? Существует существует класс boost::any, который подходит для хранения элемента, но вы не сможете сделать с ним ничего полезного, если вы все равно не знаете его тип.

person Matthieu M.    schedule 01.05.2012
comment
Да, самоанализ, вот что я ищу. Что касается типа, я не слишком беспокоюсь, так как все члены данных имеют значения int или double. Благодарю вас! - person ulu5; 01.05.2012

Ничего подобного нет в стандартном C++. Рассмотрим, как на самом деле работает структура или класс:

struct MyStruct {
  int a;
  int b;
};

Если предположить, что int имеет размер 32 бита, то расположение b MyStruct всегда находится на расстоянии 4 байт от местоположения a. Эта арифметика смещения обрабатывается компилятором заранее. Вот почему C так быстро обращается к данным членов: нет поиска во время выполнения!

Поэтому, если бы я хотел искать "b" во время выполнения, мне нужно было бы найти, где это находится в структуре. И чтобы сделать это, компилятор должен был создать таблицу смещений, чтобы сохранить ее где-то в коде. Это много накладных расходов для языка, в котором не должно быть никаких скрытых неэффективностей.

person chrisaycock    schedule 01.05.2012

К сожалению, ни один из тех, о которых я знаю. Это потребует специальной поддержки со стороны компилятора, потому что текущие компиляторы не хранят метаданные, которые требуются для такого рода отражения.

person Johm Don    schedule 01.05.2012
comment
Ну, если только вы не хотите использовать отладочные символы. :) - person dschultz; 03.05.2012
comment
Согласен, но сомневаюсь, что это когда-нибудь будет реализовано - person Johm Don; 03.05.2012