LINUX.ORG.RU

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

 , ,


1

3

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

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

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

★★★★★

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

Не особо понятно зачем нужны макросы, когда Result из стандартной библиотеки просто принимает лямбды в map/map_err и реализует тот же функционал. Возможно, библиотека появилась когда Rust ещё не имел Result в стандартной библиотеке.

В целом для дженериков макросы не нужны. Они используются для другого.

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

должна конечно, лол. Статическая рефлексия - это способ заменить поехавшую кодогенерацию во все поля, как у растоманов и прочих бездарей, на код, который будет напрямую дергать ручки компилятора так как ему надо. Экономя кучу времени путем устранения лишних промежуточных стадий компиляции и уменьшения AST.

А да, ты же сам растоман. Тогда чего я тут мечу бисер, бгг

Lrrr ★★★★★
()

Очень интересная новость. А что с производительностью у рефлексии в C++? Обычно рефлексия доступна в языках с байт кодом (Java/C#), но там и нет задачи делать код максимально производительным. Потому оверхед от рефлексии не страшен. Однако, C++ – это язык, который ставит своей задачей производительность, даже во вред удобству использования. Поменялась ли парадигма у языка и ниша в которой, по мнению Страуструпа, должен использоваться C++? Или авторы стандарта просто бездумно начали требовать все известные фичи других ЯП?

Не ухудшают ли эти дополнения код без рефлексии? Как она вообще реализована в языке без байткода?

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

Если правильно понимаю, оно compile-time. Этакие метастазы шаблонов. Оверхед околонулевой, только за синтаксис нужно бить ногами.

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

анафеме

Отличный роман Нила Стивенсона, сейчас читаю. :)

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

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

Для реализации этой функции нужно реализовать трейт Try, а это только в nightly пока. А Result реализует этот трейт, потому обходится без макроса.

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

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

Есть. Нагромождения кракозябр.

Manhunt ★★★★★
()

в forky прилетело)

etwrq ★★★★★
()
Ответ на: комментарий от dataman
$ g++-16 -std=c++26 -freflection  reflection.cpp -o reflection
$ ./reflection 
Color 0: <unnamed>
Color 0: red
$ g++-16 -v
Using built-in specs.
COLLECT_GCC=g++-16
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-linux-gnu/16/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 16-20260226-1ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-16/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust,cobol,algol68 --prefix=/usr --with-gcc-major-version-only --program-suffix=-16 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-offload-targets=nvptx-none=/build/gcc-16-AGO4iu/gcc-16-16-20260226/debian/tmp-nvptx/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=yes,extra,rtl --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 16.0.1 20260226 (experimental) [trunk r16-7708-gf8380ded1f6] (Ubuntu 16-20260226-1ubuntu1)

в Убунте все работает

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

И, видимо, взяли целью позаимствовать из Rust-а самое худшее.

тут важно еще пожалуй формализовать «худшее», определить критериальности отнесения к таковому.

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

Но вот как-то мне чаще попадаются мнения

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

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

тут важно

Совершенно не важно, смысл лишь в том, чтобы донести до окружающих свое личное субъективное мнение, что я и сделал.

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

определить критериальности отнесения к таковому.

Простота чтения кода подойдет? ИМХО, читать код на кракозябрах, как то:

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

мне лично не просто. Как и выискивать ? в Rust-овом коде чтобы понять откуда идут преждевременные return-ы.

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

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

Нет, конечно же.

Как их нет и у авторов пропозала по рефлексии.

eao197 ★★★★★
()

нужно + нужно... беру всё...

safocl ★★
()
1 мая 2026 г.
2 июня 2026 г.
Ответ на: комментарий от LongLiveUbuntu

Такой бугурт подняли, как будто Reflection_TS приняли, построенный на шаблонах и типах.

Меня новый синтаксис ничуть не пугает после [=], +[](){}, :: и <=>.

Ну добавили ^^-ушки кошки и [::]-аккордеон/баян/гармонь)).

Тут ещё и ADL во всю лишние буквы режет https://godbolt.org/z/qn1798v8G )))

Это Г(Reflection_TS), то, что ниже даже реализовали и чуть не приняли. Как удобно было бы по полям класса итерироваться без template for.

#include <experimental/reflect>
#include <iostream>
#include <string>
#include <string_view>
#include <vector>

namespace refl = std::experimental::reflect;

struct S {
    int b;
    std::string s;
    std::vector<std::string> v;
};

// 1. Получение списка членов класса или перечислений.
using meta_S = reflexpr(S);
using members = refl::get_data_members_t<meta_S>;

static_assert(refl::is_public_v<
              refl::get_element_t<0, members>>);  // Успешная проверка

// 2. Получение имени типа или члена.
template <typename Tp>
constexpr std::string_view name_of() {
    using TpInfo = reflexpr(Tp);
    using aliased_Info = refl::get_aliased_t<TpInfo>;
    return refl::get_name_v<aliased_Info>;
}

static_assert(name_of<std::string>() == "basic_string");  // Успешная проверка

// 3. Получение области видимости типа.
namespace Foo {
struct FooFoo {
    int FooFooFoo;
};
}  // namespace Foo

namespace Bar {
using BarBar = ::Foo::FooFoo;
}

using BarBarInfo = reflexpr(::Bar::BarBar);
using BarBarScope =
    refl::get_scope_t<BarBarInfo>;  // Bar, а не Foo

// 4. Преобразование перечисления в строку.
enum Color { Red, Green, Blue };

using Color_m = reflexpr(Color);

// 5. Проверка доступности членов класса.
template <typename T>
std::string_view get_type_name() {
    using T_t = reflexpr(T);
    using aliased_T_t = refl::get_aliased_t<T_t>;
    return refl::get_name_v<aliased_T_t>;
}

int main() {
    std::cout << name_of<std::string>() << std::endl;  // 2. Выведет "basic_string"
    std::cout << get_type_name<std::string>() << std::endl;  // 5. Выведет "basic_string"

    using first_m = refl::get_element_t<0, refl::get_enumerators_t<Color_m>>;
    std::cout << refl::get_name_v<first_m> << std::endl;  // 4. Выведет "Red"
}
X-Ray_3D
()
Ответ на: комментарий от X-Ray_3D

На https://en.cppreference.com/ Reflection_TS всё ещё висит, но уже новую описывать начали. Осталось дождаться Code Injection with Token Sequences — P3294R1 или похожее.

Без этого рефлексия неполноценна, если нельзя генерировать код:

X-Ray_3D
()
Ответ на: комментарий от LongLiveUbuntu

Как раз клинопись и не приняли))) Я наконец-то без внешнего кодогена смог читать/писать структуры в XML. Пытался со времён С++20 через boost::pfr, что-то работало, но постоянно не до конца и собиралось долго. https://github.com/XRay3D/TopoR.

X-Ray_3D
()
Ответ на: комментарий от dataman

Вот действительно в примере клинопись только в #include))) Но и в сырцах её почти нет, обычный крестовый код с каплей шаблончиков. Код хорошо структурирован/отформатирован, приятно читается и всё понятно, звезданул себе. Правда, с Config`ом мудрёно как-то.

Я так и не понял, чего народу не нравится.

X-Ray_3D
()
Ответ на: комментарий от X-Ray_3D

Код хорошо структурирован/отформатирован, приятно читается и всё понятно, звезданул себе.

Так автор же:

Game engine and language design enthusiast. Senior software engineer at bloomberg and voting member of WG21. Opinions are my own.

А bloomberg и сделали clang-p2996 «WG21 P2996 (Reflection)».

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

Я оба собираю самостоятельно, и рефлексия немного разная у них, имею в виду заголовочник meta - набор функций. В аннотациях поведение тоже разное местами, GCC допускает строковые литералы [[=""]](но вытащить не даёт), в clang-p2996 оборачивать во что-то приходится. Ещё в clang-p2996 можно caseы наваливать в template for внутри switch(баг)). Официальный clang надо ждать. В clang-p2996 запилили ещё и define_enum))). Курю реализацию рефлексии в GCC, всё-таки хочется запилить кодоген по бумаге P3294R2.

https://github.com/cplusplus/papers/issues/1946?ysclid=mpxxyfujz6371129545

X-Ray_3D
()
Ответ на: комментарий от aol

Не знаю, в моём интернете такое не показывают. :)

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