170 похожих чатов

Народ, а рефлексия которую планируют добавить в С++26 заменит наконец

лупхолы или нет? Можно ли будет узнать с какими типами проинстанциировалась функция/метод? Это очень нужно для стирания типа - то есть шаблонная функция в одном месте стирает тип а потом мы хотим в отдельном месте пройтись по этим типам с которым была проинстанциирована эта функция чтобы сделать проверку на рантайм-айдишник у объекта таким образом получив статический тип в лямбда-коллбеке
Например вот есть такая обертка ErasedType которая стирает тип
struct A {
....
}
struct B {
...
}
struct ErasedType {
void* ptr;
int typeId
ErasedType(auto obj){
ptr = obj;
typeId = GetUniqueIdForType<decltype(obj>()
}
}
и используем ее когда хотим например вернуть объекты разного типа из функции или добавить в какой-то контейнер
ErasedType getObj(){
if(rand() % 2){
return new A{};
} else {
return new B{};
}
}
но дальше в другом месте программы нам нужно получить статический тип и тут нужен способ пройтись по типам с которыми был проинстанциирован шаблонный конструктор ErasedType чтобы заматчить рантайм-тип (по сохраненному айдишнику) и в случае совпадания вызывать лямбду
auto getStaticType(ErasedType obj, auto fn){
//здесь нужен список типов T1, T2, T3, ... с которым был проинстанциирован конструктор ErasedType чтобы дальше заматичить айдишник и вызывать лямбду с конкретным типом после каста

if(GetUniqueIdForType<T1>() == obj.id){
fn(static_cast<T1>(obj.ptr);
}
if(GetUniqueIdForType<T2>() == obj.id){
fn(static_cast<T2>(obj.ptr);
}
if(GetUniqueIdForType<T3>() == obj.id){
fn(static_cast<T3>(obj.ptr);
}
...
}

ErasedType obj = getObj();

getStaticType(obj, [](auto concreteObj){
//здесь получаем уже статический тип
})

22 ответов

51 просмотр

Да, можно будет делать всё что угодно! P.S.: А чем std::variant не подошёл для это примера?

Интересно, как a.cpp узнает про инстанцирования из b.cpp

Богдан- Автор вопроса
🐙 Antony Polukhin
Да, можно будет делать всё что угодно! P.S.: А че...

с std::variant нужно заранее знать типы, а как я заранее узнаю тип для лямбды? что если я возвращаю по рантайм-if-у из функции или добавляю в контейнер разные лямбды (с разными замыкаемыми переменными) ?

Богдан- Автор вопроса
🐙 Antony Polukhin
Вроде std::function поможет с лямбдами

а как в std::function засунуть шаблонную лямбду?

ИМХО без динамических аллокаций красивее получается: std::variant<A, B> getObj(){ if(rand() % 2){ return A{}; } else { return B{}; } }

Богдан
а как в std::function засунуть шаблонную лямбду?

А как именно выглядит решаемая вами задача? Интересно как вы потом type_erased лямбду в другой единице трансляции в правильгый тип кастите

Богдан- Автор вопроса
🐙 Antony Polukhin
А как именно выглядит решаемая вами задача? Интере...

ну логично что сейчас лупхолы ограничены одной единицей трансляции но через лупхолы пример выше решается так https://godbolt.org/z/7hWfx18qd

Богдан- Автор вопроса
🐙 Antony Polukhin
ИМХО без динамических аллокаций красивее получаетс...

Суть не в динамических аллокациях, суть в том что с std::variant нужно заранее знать типы а пример с лупхолами этого не требует

Богдан
ну логично что сейчас лупхолы ограничены одной еди...

а рефлексия каким образом должна помочь протянуть тентакли за пределы единицы трансляции?

Богдан- Автор вопроса
Богдан
а как в std::function засунуть шаблонную лямбду?

в общем я правильно понимаю что сейчас в С++ нет никаких способов реализовать аналог std::function для шаблонных лямбд, кроме костыльных лупхолов?

Богдан
ну логично что сейчас лупхолы ограничены одной еди...

Красота... А если к std::any добавить функцию visit, ваши цели это покроет?

Богдан- Автор вопроса
Андрей Руссков
а это вообще реально?

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

Богдан- Автор вопроса
Богдан
ну логично что сейчас лупхолы ограничены одной еди...

В общем народ, я тут профиксил один баг и немного отрефактрил и вот мой контрибушн сообществу - https://github.com/vampyrofangclub/horrifiction - маленькая библиотека которая предоставляет два хелпера для реализации своих type-erasure any-like оберток template <typename T> constexpr int __get_id_from_type(); constexpr bool __get_type_from_id_impl(int typeId, void* ptr, auto fn); первая функция по переданному типу возвращает уникальный int-айдишник для типа, например __get_id_from_type<int>() //0 __get_id_from_type<double>() //1 struct SomeStruct {...} __get_id_from_type<SomeStruct>() //2 auto someLambda = [](auto anotherLambda){ return anotherLambda(123); } __get_id_from_type<decltype(someLambda)>() //3 а вторая функция делает наоборот - мы передаем int-айдишник типа (полученный из первой функции) и void* указатель и также шаблонную лямбда-коллбек и функция вызовет этот лямбда-коллбек и передаст этот void*-указатель закастованный в соотвествующий тип (и возвращает bool-флаг прошел ли матчинг - например false если матчинг не прошел и лямбда-коллбек не был вызван) void* myObjPtr = myObj; int myObjTypeId = __get_id_from_type<decltype(myObj)>(); __get_type_from_id(myObjTypeId, myObjPtr, [](auto myObj){ std::cout << "myObj->value:" << myObj->value << "\n"; }); другие примеры (простой Any-враппер для сохранения в контейнере объектов разных типов а также для возврата из функции разных шаблонных лямбд) можно посмотреть тут - https://godbolt.org/z/6GfqE3bes

Богдан- Автор вопроса

почему?

Богдан
почему?

https://en.cppreference.com/w/c/language/identifier#:~:text=All%20identifiers%20that%20begin%20with%20an%20underscore%20followed%20by%20a%20capital%20letter%20or%20by%20another%20underscore

Богдан- Автор вопроса

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Есть ли смысл устраиваться на 1с ? Даст это плюс в дальнейшем трудоустройстве на php? Просто у меня в городе вакансий на пхп нету. Или лучше удаленно искать. Опыта работы нету...
Azamat
14
а где есть mysql cloud кроме яндекс-клауд?
Oleg Nosov
13
hi im a cs student. i need some advice from people who have enough experience in Embedded Software. I need to know whether this profession is suitable for me. I have watched s...
Sahand 🏔️
8
Не ну фпц - это уже просто троллинг какой-то. Элементарный код нельзя собрать. ЧЯДНТ? program Project1; {$mode delphi} uses SysUtils, Classes, Generics.Collections; var...
Peter
4
вот что получается в интерпрететоре, работает и результаты выгляд разумными, но то как выглядит код мне не нравиться, а понять куда двигаться не очень могу, если кому не лень ...
Fedor
42
Карта сайта