Подтвердить что ты не робот

Компиляция времени в С++ 1z?

В комитете по стандартизации С++ есть исследовательская группа, обеспечивающая отражение времени компиляции в С++ 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;}};

Если это будет не так сильно, как это, каковы типичные варианты использования?

4b9b3361

Ответ 1

Варианты использования рефлексии описаны в N3814:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3814.html

Общий вид состоит в том, что мы будем делать это как расширение библиотеки Type Traits, как показано в N3815:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3815.html

Есть две части для отражения. Первая - это интроспекция. Принимать сущность и запрашивать постоянные значения об этом. Второй - это reification, что является обратным - использование значений для создания новых объектов.

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

Кроме того, мы рассмотрим вопрос о reification, который будет включать создание новых объектов из постоянных значений с большей выразительностью, чем вы можете с помощью шаблона. Поэтому, возможно, вы можете заполнить структуру std::class_specifier s, а затем вызвать make_type_from_spec(s), чтобы создать тип.

Подход к интроспекции в настоящее время имеет больше консенсуса, сторона овеществления еще дальше.