Комментарии 19
Мне вот лично больше по душе compile-time рефлексия. С помощью неё можно при желании и runtime навелосипедить, но она не вносит никакого оверхеда в процессе исполнения, если ей не пользуешься. В отличии от rtti, которая в любом случае скушает память, будешь ты делать касты или нет.
Фреймворки, заменяющие RTTI, используются как раз для того, чтобы получить предсказуемый RTTI только для некоторых классов, для которых нужен механизм RTTI (в отличие от стандартного RTTI).
Конструировать статический std::map/unordered_map/concurrent_map/mysuper_map в удобном для задачи формате из compile-time информации ровно там, где это нужно.
Написать функцию, которая по compile time данным вызовет нужный конструктор. При наличии compile time рефлексии и шаблонов, можно сделать runtime рефлексию в любом удобном виде практически забесплатно. Вот пример как выпилить к чертям Qtшный moc, заменив его на рефлексию.
https://woboq.com/blog/reflection-in-cpp-and-qt-moc.html
Увы, но в стандарт её так и не взяли. Но мне кажется, что нужно именно в этом направлении двигаться. В принципе если устраивает сидеть только на clang'е (а это почти все оси на сегодня), то можно позвать libclang.
https://woboq.com/blog/moc-with-clang.html
1. Выполнить регистрацию фабрик до старта main() за счёт вызова конструкторов этих же самых фабрик. Регистрация означает просто добавление в массив (считайте, в map).
2. Всё… Можно из этого массива через набор методов доставать информацию. Так же, как если бы был использован обычный массив (или map) фабрик, но обёрнутый в класс.
Это почти один-в-один похоже на все решения, которые тут предлагают с массивом фабрик и чуть медленнее решений, которые предлагаются со switch case (ведь вместо switch case будет обход мапы или массива).
Быстрее этого решения разве что решение, построенное на шаблонах, как это сделано с std::numeric_limits, где, фактически выполняется поиск нужной специализации шаблона. Тут я согласен, это будет быстрее, и я подумываю о том, как это можно встроить в библиотеку.
если устраивает сидеть только на clang'е
Почему? Можно ведь использовать libclang только для кодогенерации, а потом звать родной компилятор.
Как, например, по строковому имени (либо по идентификатору) создать объект класса, пользуясь compile time-рефлексией?
В простейшем варианте — при помощи switch/case или статического map<string,Factory>.
Создание экземпляра класса через оператор new внутри factory (как и без factory) — нет.
А создать фабрику типов можно и без рефлексии, с минимальным набором макросов
Ну, в библиотеке и есть этот самый минимальный набор макросов.
Немного рефлексии для С++. Часть третья: документационная