Можно ли получить количество и типы членов класса неизвестного класса? - PullRequest
1 голос
/ 01 июля 2019

у меня есть класс черного ящика, например:

class foo
{/* body is unavailable for me to inspect */};

foo может быть шаблоном.

Этот класс является окончательным черным ящиком;
- я ничего не знаю о его членах,
- я ничего не знаю о его методах,
- и т. Д.

Я пытаюсь реализовать класс class_traits:

template <typename T>
class class_traits
{
// impl
}

, что позволит мне сделать следующее (или, по крайней мере, что-то, что приведет к аналогичному результату)

int main()
{
    cout << class_traits<foo>::member_count << endl;
    cout << typeid(class_traits<foo>::member<0>::type).name() << endl;
    cout << typeid(class_traits<foo>::member<1>::type).name() << endl;
    cout << typeid(class_traits<foo>::member<2>::type).name() << endl;
    return 0;
};

Возможно ли сделать что-то подобное?Если так, то как?
Я ограничен c++17.
Я полностью согласен с макросами и другими "хакерскими" решениями (если возможно, я бы хотел оставить это во время компиляции, а не во время выполнения).

Ответы [ 2 ]

5 голосов
/ 01 июля 2019

"возможно ли получить количество и типы учеников неизвестного класса?"- Нет.

То, что вы ищете, это функция под названием отражение , которую C ++ (17 и более ранние) имеет , а не (будущие версии могут имеют некоторую форму).

3 голосов
/ 01 июля 2019

Если ваш класс является чем-то, что может быть деструктурировано, вы можете использовать структурированные привязки , чтобы получить примитивную форму отражения. См. magic_get для примера.

Из README :

struct some_person {
    std::string name;
    unsigned birth_year;
};

int main() {
    some_person val{"Edgar Allan Poe", 1809};

    std::cout << boost::pfr::get<0>(val)                // No macro!
        << " was born in " << boost::pfr::get<1>(val);  // Works with any aggregate initializables!
}
...