Size: a a a

2020 August 19

ПК

Побитый Кирпич... in pro.cxx
Sasha
Идея в том, что где-то хранится статический счетчик, при каждом вызове getTypeInfo<T>() он увеличивается и сохраняется в другую статическую переменную для этого T
Вот это вроде получше с точки зрения "нет ли тут где UB"
источник

S

Sasha in pro.cxx
Побитый Кирпич
Ну, это не аргумент в общем случае
В общем случае - да. Люди на SO пишут что msvc может сломать этот подход - свести статические функции в одну если у них одинаковый асм-код
источник

ПК

Побитый Кирпич... in pro.cxx
Sasha
В общем случае - да. Люди на SO пишут что msvc может сломать этот подход - свести статические функции в одну если у них одинаковый асм-код
Если это правда, то это оч круто
источник

S

Sasha in pro.cxx
Побитый Кирпич
Если это правда, то это оч круто
>Note that this construct (a pointer to static function template instance being unique for each template type) breaks with some compiler optimizations, such as MSVC's /Gy combined with its linker's /OPT:ICF, see the note on this page).

https://stackoverflow.com/questions/51361606/stdany-without-rtti-how-does-it-work
источник

АК

Александр Караев... in pro.cxx
Sasha
Есть необходимость иметь уникальный айдишник для некоторых типов чтобы их можно было сравнивать в рантайме, что-то вроде std::type_index.
Требования:
- переносимость не нужна (т.е. достаточно чтобы решение работало на одном компиляторе)
- поддержка полиморфных типов не нужна
- стандарт C++03 (т.е. std::type_index нельзя, он AFAIK только в 11ом появился)
- RTTI отключен (вроде как без него typeid() тоже не работает)
- читабельные имена типов и прочие плюшки не обязательны, достаточно чтобы тайп-айди был уникальным и его можно было сравнивать с другими тайп-айди

Пока смотрю на следующие трюки:
1. Адрес статического метода шаблонного класса, типа template<typename T> struct TypeInfo { static void get() {} };.
2. Шаблонная функция + макрос типа __PRETTY_FUNCTION__ который сгенерит строку для нее + адрес на эту строку. AFAIK именно этот трюк используется в boost:typeindex для ctti.
3. Какой-нибудь статический счетчик для типов.

Какие подводные камни у трюков выше? Что чатик может посоветовать?
template <class T> struct A { static void* id() { static int a; return &a; } };
источник

S

Sasha in pro.cxx
Александр Караев
template <class T> struct A { static void* id() { static int a; return &a; } };
А какие тут отличия от трюка со статическими методами?
источник

АК

Александр Караев... in pro.cxx
Sasha
А какие тут отличия от трюка со статическими методами?
тут компилятор явно не имеет права схлопнуть разные переменные в одну
источник

RY

Roman Yastrebckov in pro.cxx
народ, привет
пытаюсь удалить из <vector<vector<Point>> элементы, размер которых не входит в заданные пределы
делаю так:
   auto it = contours.begin();
   while(it != contours.end()) {
       if((it->size() < 30) || (it->size() > 70))
           contours.erase(it);
       else
           ++it;
   }
но все равно выдает vector iterators incompatible
источник

АР

Андрей Руссков... in pro.cxx
во-первых, реализация неэффективная
источник

АР

Андрей Руссков... in pro.cxx
во-вторых, используй лучше пару алгоритмов remove_if/erase
источник

NP

Nikita Provotorov in pro.cxx
Roman Yastrebckov
народ, привет
пытаюсь удалить из <vector<vector<Point>> элементы, размер которых не входит в заданные пределы
делаю так:
   auto it = contours.begin();
   while(it != contours.end()) {
       if((it->size() < 30) || (it->size() > 70))
           contours.erase(it);
       else
           ++it;
   }
но все равно выдает vector iterators incompatible
вам, товарищ, в @supapro
а ещё у вас ub тут
источник

IZ

Ilia Zviagin in pro.cxx
Игорь Лаптев
🖐 Скажите мне какой php плохой
/warn offtopic
источник

G

Group Butler [beta] in pro.cxx
Игорь Лаптев has been warned (1/3)
источник

D

Danya in pro.cxx
Roman Yastrebckov
народ, привет
пытаюсь удалить из <vector<vector<Point>> элементы, размер которых не входит в заданные пределы
делаю так:
   auto it = contours.begin();
   while(it != contours.end()) {
       if((it->size() < 30) || (it->size() > 70))
           contours.erase(it);
       else
           ++it;
   }
но все равно выдает vector iterators incompatible
1) @supapro
2) при erase у тебя инвалид линкуется it. Надо делать it = c.erase...
3)
auto it = std::remove_if(begin, end, [](auto element) { return /* условие */; });
container.erase(it, container.end());
источник

RY

Roman Yastrebckov in pro.cxx
Понял
Спасибо большое!
источник

S

Sasha in pro.cxx
Александр Караев
тут компилятор явно не имеет права схлопнуть разные переменные в одну
Мне тут коллега подсказал еще один трюк для более новых стандартов:
template<class T> void *type_id = &type_id<T>;

Иногда плюсы очень странные

https://godbolt.org/z/7cjYcx
источник

АК

Александр Караев... in pro.cxx
это же 17-й стандарт, а мы говорим о мамонте 03
источник

S

Sasha in pro.cxx
Александр Караев
это же 17-й стандарт, а мы говорим о мамонте 03
Да, верно
источник

S

Sasha in pro.cxx
Но это просто шутки ради
источник

AK

Alexey Kuznetsov in pro.cxx
Тоже к сожалению это не может работать через dll. Единственный способ чтоб подобная велосипедная система работала с динамической линковкой это генерация одинакового уникального ид для каждого типа в каждом бинаре. Самый простой способ это сделать это какойнить враппер от типа с pretty function строкой как ид, и в дальнейшем матчинг этих строк когда все длл загрузились и назначение ид руками одинаковым строкам.
источник