Matwey
Вот это все
Никита
Ребят, есть вопрос: Есть библиотека, которая вызывает коллбеком функцию, которую кидаешь в аргументы. Единственное условие - это чтобы функция была __stdcall. Как мне замаскировать такой вызов, чтобы он вызывал функцию __thiscall (Метод класса). Через static или есть ещё что-то?
Egor
Через static, да.
Egor
У всего остального вроде не особо можно указать __stdcall, потому что непонятно, как передаётся указатель this.
Никита
Egor
Ну и если библиотека не умеет передавать произвольный параметр коллбэку, то всё сразу очень плохо. Не в хлам фатально, но плохо.
ovf
кому-то надо будет сгенерировать trampoline -- в compile- или runtime по вкусу
Egor
Никита
Эээ, что?
Указатель на функцию: в моем случае BOOL (CALLBACK CLASSNAME::*NEWFUNC)(...) = &CLASSNAME::OLDFUNC(...)
Egor
Вот такую штуку очень-очень плохо конвертировать к указателю на обычную функцию.
ovf
в принципе, есть код x86_64-only, то можно, конечно, просто сделать вид, что t c::f() это t f(c*) :-)
Egor
Если без множественного наследования и виртуальных функций ещё
Egor
И это как минимум
Никита
ovf
я, эээ, не то чтобы пошутил, но так делать всё-таки не стоит
Egor
Кажется, что можно очень легко огрести даже на x86_64, просто обновив компилятор или сменив флаги компиляции.
Никита
Библиотека очень специфичная, использование соответсвенно.
ovf
сложнее, чем для x86, т.к. для x86_64 бывает всего два abi и оба говорят, что thiscall это засунуть указатель первым аргументом
ovf
(но таким можно заниматься только на очень хорошо контролируемых системах, да)
ovf
я почти уверен, что в этом вашем бусте есть универсальные генерилки trampolines
ovf
типа
#define mktrampoline(t,f,c) t f##_trampoline(c*x){return x->f();}
struct t{int foo(){}};
mktrampoline(int,foo,t*)
void withcb(int(*)(void*),void*);
void bar(){t x;withcb(foo_trampoline,&x);}
ovf
разбавить шаблонами по вкусу
Aidar
ovf
некрасиво называть вещи в свою честь.
Evgenii
what do fuuck
ovf
ага, согласен, дичь. twitter-era journalism.
> The Redis performance is strangely mega faster with LLVM Clang 6.0. These results are reproducible across multiple runs but do not yet have any explanation for the significant speed-up with Clang 6 and Redis.
ну раз самому слабо посмотреть, то хоть бы дифф выхлопа приложил. не выношу этого типа.
Evgenii
так не бывает
Evgenii
ovf
извини, всё время, которое я готов посвятить этой не сильно волнующей меня проблеме, я уже потратил на рассматривание четырёх страниц совершенно бессмысленных графиков.
Evgenii
Anonymous
Кто разбирается в winapi?
Dmitry
я разбираюсь
Dmitry
что такое?
Dmitry
хотя что значит "разбираюсь", тема настолько обширная, что в большом количестве вещей я точно не разбираюсь.
Anonymous
Напиши в личку пожалуйста
Matwey
Matwey
static void callback_wrapper(void* data) {
my_class* obj = static_cast<my_class*>(data);
obj->callback();
}
Никита
Matwey
Я и хотел так, спросил, есть ли ещё способы.
Ну я всегда так делаю. А что, неужели тебе действительно требуется сэкономить один вызов функции?
А ты уверен, что obj->callback() не заинлайнится в реальности в callback_wrapper?
Matwey
Наверняка можно по другому, через какие-нибудь ABI хаки
Matwey
Можно еще лямбду передать, но это будет тоже самое
Matwey
[](void* data) { бла бла бла }
Matwey
Лямбда, которая не захватывает переменных, вроде обязана уметь кастоваться к указателю на функцию.
Matwey
Но это всё стилистическая разница.
usernameak
меня впервые переслали из супапро в про
usernameak
http://termbin.com/w4mf
usernameak
sFormatStringBuffer& operator% (sFormatStringBuffer &,uint64_t);
sFormatStringBuffer& operator% (sFormatStringBuffer &,int64_t);
sFormatStringBuffer& operator% (sFormatStringBuffer &,void *);
sFormatStringBuffer& operator% (sFormatStringBuffer &,double);
Egor
Есть примерно такие четыре функции (в оригинале было больше, я предложил удалить примерно случайное подмножество), задача: избавиться от ambiguous overload, если вызываем sFormatStringBuffer % int
usernameak
да, оно
B
а обобщить через темплейты нельзя?
B
для целочисленных типов наверняка можно
B
тогда для int просто сгенерится своя перегрузка
Max
всем привет. друзья, может подскажет кто как можно сделать пересечение двух массивов разных типов?
Stanislav
RattenKong 🦧🐀🦍️
Max
RattenKong 🦧🐀🦍️
Max
чего непонятного? множество символов и множество цифр, надо чтобы в массиве были и те и другие
Stanislav
http://en.cppreference.com/w/cpp/algorithm/set_intersection
Max
wooo taaak slojnaaaa
Egor
Max
они не равны, я хочу сделать множество, в котором будут элементы первого и второго массива
Max
с символами и цифрами
Egor
Нельзя сделать массив, в котором лежат элементы разных типов.
vladislav
Max
vladislav
Погугли
vladislav
Задача то какая?
Max
программу пишу, хотел сделать массив со всеми элементами, чтобы было проще
Stanislav
#supapro
Dr. Friedrich
Egor
Кстати, да, го туда.
vladislav
std::any?
И зачем новичку такие вещи?
Max
Dr. Friedrich
Ну ок, boost::any? 😁
vladislav
Потому что прочитай описание
Ender