Т.е. мы в экземляр класса XY сеттим коллбэк, который является обычной функцией, не членом, и при ее вызове нам не передается указатель того объекта, который ее вызвал.
Задача: при вызове pfnCallback, в ее теле, нам надо узнать какой из объектов XY ее сейчас вызвал.
Кода XY у нас нет и изменить мы его не можем, мы пишем ту прослойку которая ставит в экземпляры XY коллбэки. Вот тело коллбэка мы можем менять как угодно. Можно использовать глобальные переменные и тд. Решение должно быть кроссплатформенное — винда, линукс, андроид, и для каждой ОС там должны поддерживаться все компиляторы которые могут C++11
Re: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
A>Кода XY у нас нет и изменить мы его не можем, мы пишем ту прослойку которая ставит в экземпляры XY коллбэки. Вот тело коллбэка мы можем менять как угодно. Можно использовать глобальные переменные и тд. Решение должно быть кроссплатформенное — винда, линукс, андроид, и для каждой ОС там должны поддерживаться все компиляторы которые могут C++11
Ответил бы, да сильно не понравилась тональность поста. Очень уже отвык от приказного начальственного тона во всяких «красных компаниях».
Создалось впечатление, что очередной тимлид из тех, что сперва по дурости своей разгонят всех квалифицированных специалистов, оставив вокруг себя одних «собак», а потом по форумам лазают с вопросами по элементарным вещам.
Re: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
A>Задача: при вызове pfnCallback, в ее теле, нам надо узнать какой из объектов XY ее сейчас вызвал.
А что экземпляр класса XY передает в int param вашему коллбэку? Из этого значения нельзя выудить экземпляр XY?
Re: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
A>Т.е. мы в экземляр класса XY сеттим коллбэк, который является обычной функцией, не членом, и при ее вызове нам не передается указатель того объекта, который ее вызвал. A>Задача: при вызове pfnCallback, в ее теле, нам надо узнать какой из объектов XY ее сейчас вызвал.
Типа такого?
A>>Задача: при вызове pfnCallback, в ее теле, нам надо узнать какой из объектов XY ее сейчас вызвал. C>А что экземпляр класса XY передает в int param вашему коллбэку? Из этого значения нельзя выудить экземпляр XY?
Нет, там по факту разные классы используют этот механизм, обычно какой-то статус, код ошибки или флаг состояния передают.
Re: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
A>Допустим у нас есть библиотечный класс, у которого есть функция, которая принимает указатель на функцию в качестве коллбэка
A>
A>Т.е. мы в экземляр класса XY сеттим коллбэк, который является обычной функцией, не членом, и при ее вызове нам не передается указатель того объекта, который ее вызвал. A>Задача: при вызове pfnCallback, в ее теле, нам надо узнать какой из объектов XY ее сейчас вызвал.
А в чём сложность? Создайте по экземпляру сallback'а на каждый set, а внутрь запишите указатель на XY.
И каждый день — без права на ошибку...
Re[2]: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
BFE>>А в чём сложность? Создайте по экземпляру сallback'а на каждый set, а внутрь запишите указатель на XY.
A>В общем, в том и сложность. Коллбэк это просто сишная функция. Каким образом записать внутрь указатель?
На каждый вызов xy.setCallback(..);
пишите функцию callbackNum0001(..);
рядом заводите глобальную переменную XY* xyNum0001;
перед xy.setCallback(..); в xyNum0001 записываете указатель на xy, которую используете в callbackNum0001(..)
Если xy не создаются динамически, то никаких проблем.
И каждый день — без права на ошибку...
Re[3]: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
BFE>>А в чём сложность? Создайте по экземпляру сallback'а на каждый set, а внутрь запишите указатель на XY.
A>В общем, в том и сложность. Коллбэк это просто сишная функция. Каким образом записать внутрь указатель?
Сделайте динамически.
BFE>На каждый вызов xy.setCallback(..); BFE>пишите функцию callbackNum0001(..); BFE>рядом заводите глобальную переменную XY* xyNum0001; BFE>перед xy.setCallback(..); в xyNum0001 записываете указатель на xy, которую используете в callbackNum0001(..) BFE>Если xy не создаются динамически, то никаких проблем.
В этом и проблема, объекты xy создаются динамически в произвольных количествах.
Re[4]: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
A>В этом и проблема, объекты xy создаются динамически в произвольных количествах.
Насколько я понимаю, в рамках С++ такая задача не решаема: не существует способа динамически создать копию функции. Так что либо вы заранее создаёте 100500 функций, как предлагает рядом kov_serg, либо выходите за рамки стандарта и начинаете писать грязные хаки.
Чисто из любопытства, а зачем вам все эти извращения? Почему нормально нельзя сделать?
И каждый день — без права на ошибку...
Re[6]: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, Aleksey82, Вы писали:
BFE>Чисто из любопытства, а зачем вам все эти извращения? Почему нормально нельзя сделать?
Не автор, но первое что приходит на ум это win32 API.
Часть колбеков там не используют что-то типа "void *context",
поэтому кто не хочет иметь кучу глобальных переменных извращается как может.
ATL библиотека от MS например генерировала на лету машинный код
например, типа:
struct Thunk {
BYTE jmp; // op code of jmp instruction
DWORD relproc; // relative jmp address
};
Re[2]: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, TimurSPB, Вы писали:
A>>Ответил бы, да сильно не понравилась тональность поста. TSP>Отличная формулировка. Буду тестерам пункты возвращать с такой фразой.
Тащить с интернет-форумов в работу и взаимодействии с коллегами? Это кривая дорожка, однозначно
За хамство и грубость в отношении тестеров увольнять следует в первую очередь. Во-вторую, за подобное по отношению к непосредственным подчинённым или обслуживающему персоналу.
Да, в интернетах могут и на х.. послать, но в общении с коллегами — это недопустимо.
Re: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, Aleksey82, Вы писали:
A>Решение должно быть кроссплатформенное — винда, линукс, андроид, и для каждой ОС там должны поддерживаться все компиляторы которые могут C++11
Не вопрос, босс — $100 за консультацию, и решение у вас в кармане.
Re[2]: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, cppguard, Вы писали:
A>>Решение должно быть кроссплатформенное — винда, линукс, андроид, и для каждой ОС там должны поддерживаться все компиляторы которые могут C++11
C>Не вопрос, босс — $100 за консультацию, и решение у вас в кармане.
Хм. Сделать это надежно и чтобы везде работало гораздо больше, чем $100 стоит. За $100 я бы дал совет, этого не делать
Re[3]: Как из тела функции понять кто ее вызвал? (придумать С++ механизм)
Здравствуйте, TimurSPB, Вы писали:
A>>Ответил бы, да сильно не понравилась тональность поста. TSP>Отличная формулировка. Буду тестерам пункты возвращать с такой фразой.
Это надо на собеседованиях говорить, когда предлагают тестовое задание.
Re: Как из тела функции понять кто ее вызвал? (придумать С++
Здравствуйте, Reset, Вы писали:
R>... Для всех 3 комбинаций есть backtrace/stacktrace (если задача решается перебором 3 вариантов — то другое решение не ищут).
Что-то я похоже туплю и не понял как backtrace/stacktrace может помочь ТСу? Ему же нухно узнать не какая функция/метод вызвала callback, а какой объект вызвал, т.е. надо анализировать стековые фреймы цепочки вызовов и найти там указатель this. И похоже, что анализировать без наличия отладочной информации, т.к. библиотечный код не его.
Re[3]: Как из тела функции понять кто ее вызвал? (придумать С++
C>Что-то я похоже туплю и не понял как backtrace/stacktrace может помочь ТСу? Ему же нухно узнать не какая функция/метод вызвала callback, а какой объект вызвал, т.е. надо анализировать стековые фреймы цепочки вызовов и найти там указатель this. И похоже, что анализировать без наличия отладочной информации, т.к. библиотечный код не его.
Опс, ошибочка вышла. Невнимательно прочитал. Какой объект вызвал функцию, так, похоже, не узнать.