2016-05-25 4 views
0

Я получил обратную кодировку на C++ после долгого времени и задавался вопросом, есть ли способ быстро получить доступ к члену данных класса для манипуляций.Доступ к членам класса в C++

Предположите случай, когда у вас есть 10 членов данных в классе, который перегружает кучу операторов (думал об этом при перегрузке оператора =). Теперь вам нужно добавить/вычесть несколько членов данных в класс. Есть ли общий способ сделать это без необходимости переходить на отдельные функции и изменять их? Я думаю о возможности запуска всех членов класса в виде конструкции цикла.

+0

так что вы хотите, чтобы применить ту же операцию с набором переменных, которые могут изменить? Все ли они одного типа? – jaggedSpire

+2

Это неопределенное описание. Даже псевдокод может прояснить, чего вы хотите достичь. –

+4

Если я правильно вас понимаю, тогда нет. У C++ нет поддержки такого отражения. Если вы представите пример, у кого-то может быть элегантное решение для вашего конкретного случая. – MikeMB

ответ

2

Как нет встроенного отражения в C++ (пока), вы должны где-то перечислить всех своих членов. Один из способов, чтобы спасти вас от делать это снова и снова, чтобы определить for_each_member метод, который проходит каждый член в какой-то функтор:

template <class F> 
void for_each_member(F f); 

Теперь вы можете легко применять произвольные операции для всех ваших членов, и у вас есть только поддерживайте один список участников в классе.

Запуск Пример: http://coliru.stacked-crooked.com/a/c813fc73c5519ee0

Если вы хотите, чтобы выполнять различные действия для различных подмножеств члена, вы должны найти способ, чтобы отделить их друг от друга. Вы можете сделать это по типу (как показано в примере), или вы можете дополнительно передать какой-то идентификатор вашему функтору в for_each_member.

Здесь я использую макрос передать как элемент и его имя функтора: http://coliru.stacked-crooked.com/a/5a59c027e25c33fb

+0

Не стесняйтесь публиковать больше кода в своем вопросе. Это было бы легче прочитать для будущих исследований. Имейте живые примеры ссылок для улучшения. –

+0

Получает меня очень близко к тому, что я ищу .. Спасибо! –

0

Я думаю о возможности использования всех членов класса в виде конструкции цикла.

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


Что вы можете сделать, конечно, что-то, чтобы сохранить ваши переменных значения членов класса в своем роде std::map<std::string,T> словаря, и доступе к ним с символическими ключами (замещающих действительными переменными-членами класса, конечно). не

Но это потребовало бы тип значения, чтобы быть

+0

Я не знал о 'std :: any', так что это удивительно, это скорее проблема пользователя XY. –

+0

Я подумал о чем-то подобном. Существенная проблема заключается в том, что члены класса могут быть разных типов. Вот что сделало конструкцию вроде «struct» полезной в первые дни программирования. Нужно решение, для которого достаточно общего для всех членов данных, без необходимости изменять или размещать их в контейнере. –

Смежные вопросы