В комитете по стандартизации C ++ существует исследовательская группа, которая обеспечивает отражение во время компиляции в C ++ 1z или после. Я хотел бы знать, какова цель и насколько мощными будут ожидаемые инструменты?
Например, можно ли назвать функции или классы с помощью этих инструментов?
struct A {int f() {return 42;}};
struct B {int (std::reflect<A>::member<0>::declname)() {return 43;}};
// equivalent to struct B {int f() {return 43;}};
Если он не будет таким мощным, какими будут типичные варианты использования?
Примеры использования отражений описаны в N3814:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3814.html
Общее мнение состоит в том, что мы сделаем это как расширение библиотеки признаков типа, примером которой является N3815:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3815.html
Есть две части для размышления. Первый интроспекция. Взятие сущности и запрос постоянных значений об этом. Второй овеществление, что наоборот — использование значений для создания новых сущностей.
Для самоанализа — вы можете ожидать дополнительных характеристик, которые позволят вам перечислять и получать имена членов класса, базовых классов, перечислителей, параметров функций и так далее во время компиляции. Оттуда вы можете использовать их для таких вещей, как сериализация, членские операции, статические проверки и различные другие вещи.
Кроме того, позже мы рассмотрим реификацию, которая будет включать создание новых сущностей из постоянных значений с большей выразительностью, чем вы можете с помощью шаблона. Так что, возможно, вы могли бы заполнить std::class_specifier s
структурировать, а затем вызвать make_type_from_spec(s)
создать тип.
Подход самоанализа имеет больше консенсуса на данный момент, сторона реификации еще дальше.
Других решений пока нет …