LINUX.ORG.RU

GCC 16 с C++26-рефлексией

 , ,


0

5

Тот редкий случай, когда обновление Devuan/Ceres сильно удивило. :)

https://gcc.gnu.org/gcc-16/changes.html#cxx:

clang 23.0 пока отстаёт. :)

★★★★★

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

волшебный Диван - в forky atm 15.2 ;/

etwrq ★★★★★
()

У меня и пятнадцатый cyrus-imap, например, собирать уже отказывается, а тут ещё и рефлексируют )

GAMer ★★★★★
()

enabled by -std=c++26 -freflection

/usr/include/c++/16/meta есть, но

g++-16: error: unrecognized command-line option ‘-freflection’

😢

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

unrecognized command-line option ‘-freflection’

А в https://jwakely.github.io/pkg-gcc-latest работает, держу в курсе. :)

#include <print>
#include <meta>

template<typename E, bool Enumerable = std::meta::is_enumerable_type(^^E)>
  requires std::is_enum_v<E>
constexpr std::string_view enum_to_string(E value) {
  if constexpr (Enumerable)
    template for (constexpr auto e :
                  std::define_static_array(std::meta::enumerators_of(^^E)))
      if (value == [:e:])
        return std::meta::identifier_of(e);

  return "<unnamed>";
}

int main() {
  enum Color : int;
  static_assert(enum_to_string(Color(0)) == "<unnamed>");
  std::println("Color 0: {}", enum_to_string(Color(0)));  // prints '<unnamed>'

  enum Color : int { red, green, blue };
  static_assert(enum_to_string(Color::red) == "red");
  static_assert(enum_to_string(Color(42)) == "<unnamed>");
  std::println("Color 0: {}", enum_to_string(Color(0)));  // prints 'red'
}

$ /opt/gcc-latest/bin/g++ -std=c++26 -freflection enum_to_string.cpp -o enum_to_string

./enum_to_string
Color 0: <unnamed>
Color 0: red
dataman ★★★★★
() автор топика
Ответ на: комментарий от WatchCat

Некоторые люди, которые сейчас двигают пропозалы в C++, фанатеют от синатаксиса Rust-а. Барри Ревзин (один из авторов пропозала по рефлексии), например. И, видимо, взяли целью позаимствовать из Rust-а самое худшее.

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

Примерно такое есть:

print!(xxx)

«Печатай, кому говорю!»

Но тут ^^ ещё как-то можно за уши притянуть: & vs && и | vs ||. То [:e:] это уже каким-то perl или tr пахнет.

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

В расте ничего подобного нет.

А давайте посмотрим, что есть в Rust:

  • экономия на спичках: mut, fn, i16, u8;
  • односимволные обозначения для очень важных концепций (!, ' или ?);
  • отдельный язык макросов, прилепленный сбоку к основному языку.

Когда кто-то начинает вдохновляться таким образчиком, то и в С++ предлагает делать синтаксический кошмар в виде:

add<[:...sizes<^^ns>():]...>();

https://yapx.ru/album/dIYXc

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

односимволные обозначения для очень важных концепций

!, &, &&, &=, << - всё это было в цпп до раста

отдельный язык макросов, прилепленный сбоку к основному языку.

Было в цпп до раста.

С++ предлагает делать синтаксический кошмар

Всегда так было.

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

!, &, &&, &=, << - всё это было в цпп до раста

Почему как только начинаешь более-менее серьезно разговаривать с Rust-офилом+C++-фобом, так быстро выясняется, что у персонажа реверсивное умственное развитие?

eao197 ★★★★★
()

https://vittorioromeo.com/index/blog/refl_compiletime.html

Every single TU including one of those libraries will virally include <meta> and any other used dependencies.

Assuming the usage of <meta> + <ranges> becomes widespread, we’re looking at a bare minimum of ~540ms compilation overhead per TU. Using PCHs (or modules) will become pretty much mandatory, especially in large projects.

в общем как обычно, наговнокодили. Это при том что рефлексия в теории должна снижать время компиляции, а не повышать его.

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

То [:e:] это уже каким-то perl или tr пахнет.

Ну не догадались они в P2996R13 заменить в примере e на xxx!
Кстати, в Дебиановском gcc-16-20260308-1 починили поддержку -freflection.

dataman ★★★★★
() автор топика
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от GAMer

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

Оно, конечно же, понятно, что «красота» синтаксиса – дело субъективное. Но вот как-то мне чаще попадаются мнения, что [:e:] – это ужасно, чем противоположные.

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от dataman

тут конечно не мое дело как жава-макаки, но вот неужели с этом самом C++, претендующем на звание ООП, у произвольной enum, в том числе Color, не нашлось места для метода name/getName? Возможности языка здесь можно демонстрировать на любых примерах (хотя судя по всему будет так или иначе всрато), но только на на enum.

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

этом самом C++, претендующем на звание ООП

Нет, есть возможности ООП, что не то же самое.

не нашлось места для метода name/getName?

Это бы предполагало, что есть какой-то базовый enum, но зачем?

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

отдельный язык макросов, прилепленный сбоку к основному языку.

Ты либо не знаешь о чём говоришь, либо занимаешься жирным троллингом. Это в плюсах препроцессор прилеплен сбоку к основному языку и по сути полноценно не работает с элементами языка.

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

Ты либо не знаешь о чём говоришь, либо занимаешься жирным троллингом.

Либо и знаю о чем говорю, и занимаюсь тонким троллингом.

Это в плюсах препроцессор прилеплен сбоку к основному языку и по сути полноценно не работает с элементами языка.

Только вот в плюсах нет собственного препроцессора.

И тот набор лексем, которые выше unCORr поставил в вину C++у, отнюдь не C++ные.

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

Это бы предполагало, что есть какой-то базовый enum, но зачем?

Л - от слова (Л)огика, чет есть мнение, что не будь там всяких комитетов по языку, Бьёрн таки довел бы все это дело если бы не до совершенстваума, то хотя бы до какого-то вменяемого состояния. А пока выглядит так, что куча бандерлогов хотят похоронить язык довольно необычным способом.

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

А пока выглядит так, что куча бандерлогов хотят похоронить язык довольно необычным способом.

C++ с 1991-го или 1992-го года развивается кучей бандерлогов. И тот самый C++98, который был первым стандартизирован, уже являлся результатом труда комитета, а не одного лишь Страуструпа.

И есть мнение, что не будь этой работы по стандартизации, растащили бы в 1990-е Borland и Microsoft язык в разные стороны со своими собственными расширениями.

eao197 ★★★★★
()

Такую штуку нашёл: https://github.com/klimentyev/reflexym.

$ cat reflexym.h:

#include <dlfcn.h>
#include <iostream>
#include <meta>

template <typename T>
T reflexym_loader(void* handle)
{
    T api{};

    constexpr auto ctx = std::meta::access_context::unchecked();
    template for (constexpr auto field : define_static_array(nonstatic_data_members_of(^^T, ctx)))
    {
        constexpr auto symbol_name = identifier_of(field);
        const auto sym = dlsym(handle, symbol_name.data());
        api.[:field:] = reinterpret_cast<typename[:type_of(field):]>(sym);
        if (!api.[:field:])
        {
            std::cerr << "Error: symbol " << symbol_name << " not found!\n";
        }
    }

    return api;
}

Пример:


struct api_t
{
    double (*cos)(double) = nullptr;
    double (*sin)(double) = nullptr;
    void (*sincos)(double, double*, double*) = nullptr;
    const char* (*zlibVersion)() = nullptr;
};

try
    {
        const auto lib_name = "libm.so.6";
        void* handle = dlopen(lib_name, RTLD_LAZY);
        if (!handle)
        {
            throw std::runtime_error("Error: library " + std::string(lib_name) + " not found");
        }

        const auto math_api = reflexym_loader<api_t>(handle);
        if (math_api.sin)
        {
            std::cout << math_api.sin(0.0) << "\n";
        }
        if (math_api.cos)
        {
            std::cout << math_api.cos(0.0) << "\n";
        }
        if (math_api.sincos)
        {
            double s = 0;
            double c = 0;
            math_api.sincos(0.0, &s, &c);
            std::cout << s << " " << c << "\n";
        }
        dlclose(handle);
    }
    catch (const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
dataman ★★★★★
() автор топика
Ответ на: комментарий от borisych

Бьёрн таки довел бы все это дело если бы не до совершенстваума, то хотя бы до какого-то вменяемого состояния.

Было бы то же самое: люди бы просили добавить и то и сё, и стало бы необходимо как-то определять поддержку возможностей языка компиляторами.
Э - от слова (э)волюция. :)

dataman ★★★★★
() автор топика
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от eao197

Только вот в плюсах нет собственного препроцессора.

Так плюсы не самостоятельный язык, тяжко ему без сишечки. Поэтому и препроцессор сишечный в стандарте и сишечная стандартная библиотека тудой же перетянута целиком.

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

Так плюсы не самостоятельный язык, тяжко ему без сишечки

Именно так. За счет этого C++ и смог вылезти в мейнстрим. И остаться там до сих пор за счет прозрачного и бесплатного интеропа с Си.

А без этого бы не случилось и LLVM. А без LLVM не случилось бы и Rust-а.

Поэтому и препроцессор сишечный в стандарте и сишечная стандартная библиотека тудой же перетянута целиком.

Ага, и зная это предъявлять претензии C++у по поводу С-шного препроцессора – это от большого ума, не иначе.

Когда C++у возможностей Си не хватило, C++ не стал делать отдельный язык препроцессора, как и не стал насиловать унаследованный С-шный препроцессор, а внедрил шаблоны прямо в C++. И если мне, для примера, захочется наколхозить что-то вроде Either на C++, то мне не придется генерировать часть кода отдельным препроцессором. А вот в Rust-е приходится.

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

Прикольно, конечно, замена X Macro. По идее, должно стать лаконичней и удобней. Не в упрёк рефлексии (наверное, такая фича должна выглядеть необычно) - увидев первый листинг, не узнал бы в нём плюсы, да, похожие слова, но язык другой

kvpfs_2
()

Вы не рефлексируйте, вы распространяйте!

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

Ага, и зная это предъявлять претензии C++у по поводу С-шного препроцессора – это от большого ума, не иначе.

Да нет, это вполне оправданная претензия к инструментам языка которые прописаны в стандарте. А вот оправдываться кивая в сторону сишечки, что это её косяки, а не плюсов, как раз не от большого ума.

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

А вот оправдываться кивая в сторону сишечки, что это её косяки, а не плюсов, как раз не от большого ума.

Во-первых, я как бы на большой ум и не претендую, но встречаются персонажи, которые удивляют даже меня.

Во-вторых, C++ уже пятое десятилетие расплачивается за свой выбор (надстройка над Си). Поэтом косяки Си в него заложены by design и от этого никуда не дется, т.к. тогда в C++ вообще смысла не будет. Посему да: препроцессор – это косяк Си, короткие обозначения вроде &, &&, || и пр. – это косяк Си. А C++у с этим приходится жить.

Только вот Rust-оделы хотели сделать язык лучше чем Си и C++, но мало того, что сохранили часть косяков из синтаксиса Си, так еще и своих добавили.

И признать это стесняются. Типа «вы на свой C++ посмотрите!»

Ну вот мы смотрим – ужас, да. Но как глядя на этот ужас можно было сделать хуже? Старались, видимо.

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

Ну синтаксис раста, как и синтаксис жабки, это синтаксис с оглядкой на сишечку/плюсы как самые распространённые языки. Борьба за пользователя. Синтаксис оформления лайфтаймов мне кстати тоже не нравится. Хотя по большому счёту у меня к синтаксису что плюсов, что раста больших претензий нет, т.к. это по большому счёту вкусовщина. Но громче всего о синтаксисе раста почему-то тут на лоре возмущались те кто топит за сишечку с плюсами.

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

value == [:e:]

всё, С++ закончился. начался раст. потому:,[что!нельзя,:абузить*символы][&?пункуации.

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

да, походу придется линять от этого рака. это ж реально нечитаемо.

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

это не «расплата». это звездец. вместе с рефлексией завезли какой-то ядерный гомосексуализм который запрещен между прочим.

мерзотный растоподобный синтаксис - здобулы. срань какую-то которую я даже описать не могу потому что читаю и произвожу кирпич - здобулы. нет. в жопу. С++ закончился. на 17м где-то. увы.

Надо форкать.

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

Но громче всего о синтаксисе раста почему-то тут на лоре возмущались те кто топит за сишечку с плюсами.

Ну так мы же хотели большой и чистой любви прекрасного светлого будущего, а получили такое же Г, как и было :(

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

Не кипятись if constexpr вкупе с концептами убрали кучу SFINAE дрысни, часто малопонятной. Рефлексия выглядит необычно, да, надо привыкнуть, но она убирает X Macro портянки, которные выглядят ничуть не лучше, их ещё и отлаживать сложнее - смотря выхлоп препроцессора. Ну и нужна она не так уж часто на самом деле.

Я вот ещё всё жду когда уже нормально модули доделают (хотя бы std), чтобы писать import std, вместо портянки include’ов. Покрутил как-то, clangd автокомплит не работает для стд сущностей, не годится.

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

Корутины норм. Но голову нужно сломать. И без поддержки - совсем жвах. Пользовался в Asio, приятно. Но «вирусность» бест порой, когда по логике нужно вызвать корутину Б из функции В, которая была вызвана из корутины А. Приходится всю цепочку делать корутинами.

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

О, а с манглингом оно сможет?

Наверное, если продолжать эксперименты. :)

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

Я все пока еще никак не доберусь их опробовать. Не хватает свободного времени для этого занятия :(

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

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

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

рефлексия в теории должна снижать время компиляции

Не должна. Она же compile-time, завязана на constexpr/consteval, а они буквально заставляют компилятор исполнять дополнительный пользовательский и библиотечный код.

KivApple ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.