LINUX.ORG.RU

Compile-time рефлексия на c++1z

 , ,


1

4

Я тут с начала октября пишу свою реализацию с Compile-time рефлексии, и у меня в итоге появились первые результаты работы. Что в ней есть:

  • Счетчики методов/переменных
  • Получение/присвоение переменных через индекс
  • Поиск переменных по имени
  • Получение типа переменной
  • статичные переменные
  • Получение имени класса
  • запуск методов через индекс
  • получение типа возвращаемого значения метода, получение типов входных аргументов
  • константный методы
  • статичные методы
  • Поиск методов по имени
  • попытка запустить кучу методов (там кортеж из индексов на вход идёт) с данными аргументами, неудача не ведет к ошибки компиляции(sfinae)
  • Получение имени переменной/метода

Я пока не делал документацию, и оформление кода хромает. Но это все уже активно пилится. Зависимости: boost.hana, boost.type_index (только в первом примере используется). Из С++1z: Поддержка if constexpr (), std::conjunction.

Подробности:

Ссылка на проект

Первый пример

Второй пример

Скриншот выхлопа первого примера

Скриншот выхлопа второго примера

P.S: Да макросы и не красиво, но с таким функционал без них никак не обойтись.

P.S.S: В файле utils можно убрать namespace std {...} если у Вас std::is_*_v уже в стандартной библиотеке определены.

P.S.S.S: лицензия GPLv3.



Последнее исправление: maxis11 (всего исправлений: 1)

P.S: Да макросы

С макросами оно просто не нужно.

лицензия GPLv3.

Вдвойне не нужно. Лучше уж пилить совместимые по API расширения для gcc/clang, которые будут генерить доступные в рантайме описания для типов.

anonymous
()

Насчет макросов

В принципе, макросов не так много как может показаться. Макрос для формирования строкового типа данных, который представляет из себя template<char... c> class string_c {...}, METACLASS_DEFENITION - который создает compile-time(далее ct) счетчики, имя класса и метод для sfinae (узнать зарефлекченый ли класс или нет). TUPLE_APPEND - по сути friend constexpr auto функция от текущего счетчика, которая возвращает кортеж на constexpr прокси-класс указателя метода/переменной. Там в итоге будет что то friend constexpr auto STATE (counter<0>, const Type*), friend constexpr auto STATE (counter<1>, const Type*) и.т.д. Далее это все собирается в одном классе (MetaClass). И уже идут чистые плюсы

maxis11
() автор топика

макросы

Читер.

Deleted
()

лицензия GPLv3.

Таки сразу умножил на 0.

Как-то magic_get сильно аккуратнее выглядит. Оно правда только для POD

#include <iostream>
#include "boost/pfr.hpp"

struct my_struct { // no ostream operator defined!
    int i;
    char c;
    double d;
};

int main() {
    using namespace boost::pfr::ops; // out-of-the-box ostream operator for all PODs!

    my_struct s{100, 'H', 3.141593};
    std::cout << "my_struct has " << boost::pfr::tuple_size<my_struct>::value
        << " fields: " << s << "\n";
}

my_struct has 3 fields: {100, H, 3.14159}

anonymous
()
Ответ на: комментарий от anonymous

Я регистрировал аккаунт, когда там бесплатными билеты на какое-то мероприятие раздавали, так то я просто очень мало общаюсь на форумах, поэтому вот так и выходит, так то я это все начал писать 29 сентября. пруф(запись в вк, если религия не позволяет, то можешь не переходить по ссылке)

maxis11
() автор топика
Ответ на: комментарий от anonymous

Да, я знаю про неё, я свою версию скорее затачивал под ct поиск переменных и выполнения методов (второй пример наглядно показывает как отлично можно написать visitor для std::any)

maxis11
() автор топика
Ответ на: LGPLv3 от maxis11

Не слушай дурачьё, оставь свободную GPLv3. Здесь между LGPL и GPL разницы нет, потому что библиотека всё равно в хедерах чуть более чем полностью.

slovazap ★★★★★
()
Ответ на: комментарий от andreyu

C++14

Как закончу с документацией (или хотя бы напишу объяснительные комментарии к функциям) создам ветку с портом с++14. Там правда будет еще адовее ибо все if constexpr будут заменены на отдельные функции с std::enable_if. std::conjunction не составит труда реализовать свой.

maxis11
() автор топика

лицензия GPLv3

Вдвойне не нужно

Изменил GPLv3 на LGPLv3

Не слушай дурачьё, оставь свободную GPLv3.

Спасибо, откатил обратно

А ты мягкий ( ͡° ͜ʖ ͡°)

Crocodoom ★★★★★
()
Ответ на: комментарий от zamazan4ik

Потому что там требуется компилятор с поддержкой рефлексии(причем он форкнутый отдельно от mainline находится). Если бы я был бы уверен, что эту рефлексию примут в C++20, а не как всегда, я бы не стал пилить свой вариант.

maxis11
() автор топика
Ответ на: комментарий от Dudraug

А вижла до сих пор не умеет в с++14

Там вроде только пара фич с++14 не реализована.

у него версия 5.0 стоит

shty ★★★★★
()
Ответ на: комментарий от shty

В 2015 даже не весь C++11 есть (пруф), для С++14 как минимум у 5 из 12 пунктов стоит No.

xaizek ★★★★★
()

Срочно комить в Qt6! :)

Srsly, круто.

Stil ★★★★★
()
Ответ на: комментарий от andreyu

А у свободных компиляторов всё в шоколаде.

На Linux.org.ru, ресурсе, посвященному в первую очередь СПО и ОпенСоурс, приоритет проприетарных компиляторов под проприетарные платформы ожидаемо должен быть около плинтуса.

anonymous
()
Ответ на: комментарий от anonymous

На Linux.org.ru, ресурсе, посвященному в первую очередь СПО и ОпенСоурс, приоритет проприетарных компиляторов под проприетарные платформы ожидаемо должен быть около плинтуса.

По вашему СПО и ОпенСоурс невозможны при использовании проприетарного компилятора?
И вообще, чем отличается СПО от ОпенСоурс?

andreyu ★★★★★
()
Ответ на: комментарий от shty

у него версия 5.0 стоит

Вас Евгений Ваганыч попросил его подменить?

andreyu ★★★★★
()

подскажите пожалуйста в чем профит

запуск методов через индекс

прст вообще не шарю. в чем отличие метода от функции?

dima1981
()

Скриншот выхлопа

почему не «скриншот кода»? не лезет в экран --- 17 скриншотов.

ну жесть же.

Rastafarra ★★★★
()
Ответ на: комментарий от Rastafarra

82 и 113 строчки кода, причем стиль оформления далеко не самый компактный

maxis11
() автор топика
Ответ на: комментарий от CatsCantFly

UnrealEngine например, Open Source но не СПО

Похоже, вы не в курсе чем пример отличается от определения.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.