Перечисление структуры C / C ++ - PullRequest
4 голосов
/ 10 мая 2019

Предположим, у меня есть структура или аналогичный класс (C ++), подобный этому:

    struct str
    {
        int a = 5;
        char b = 'x';
    };

Есть ли способ перечислить своих членов. Я хочу найти имена членов, значения и, если возможно, типы данных.

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

Я думаю представить формат командного пакета в структурах. Если вы можете порекомендовать другую структуру данных для ее хранения, то это тоже нормально. Языки могут быть C или C ++. Производительность является главным приоритетом, поэтому XML и подобные типы не рекомендуется. В памяти структуры данных являются предпочтительными. Любая помощь высоко ценится. Спасибо

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Псевдоотражение на основе макросов с boost.hana:

#include <iostream>
#include <string>
#include <boost/hana.hpp>

struct Person
{
    BOOST_HANA_DEFINE_STRUCT
    (
        Person
    ,  (::std::string, name)
    ,  (int, age)
    );
};

int main()
{
    Person john{"John", 30};
    ::boost::hana::for_each
    (
        ::boost::hana::members(john)
    ,   [](auto const & member)
        {
            ::std::cout << member << ::std::endl;
        }
    );
    return 0;
}
3 голосов
/ 10 мая 2019

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

Некоторые компиляторы при реализации «отладочных сборок» предоставят способы вашегореализовать то, что вы хотите (обратитесь к документации), но любой код, который вы пишете, не будет переносимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...