Есть функция некоторого API, которая принимает в качестве аргумента указатель на свободную функцию. Ей необходимо передать нестатическую функцию-член.
Т.к. напрямую этого сделать нельзя (как известно, указатель на нестатическую функцию-член и указатель на свободную функцию — это абсолютно разные типы), я решил попробовать создать на основе возвращаемого функцией std::bind значения объект класса std::function, у которого вызвать функцию-член target.
Существует ли вообще нормальный способ преобразовать указатель на функцию-член в указатель на свободную функцию или нет? Предполагаю, что нет, но мало ли кто-нибудь придумал решение.
Re: Convert non-static member function pointer to function pointer
Здравствуйте, Nikita.Trophimov, Вы писали:
NT>Существует ли вообще нормальный способ преобразовать указатель на функцию-член в указатель на свободную функцию или нет? Предполагаю, что нет, но мало ли кто-нибудь придумал решение.
концептуально функция член ничего не умеет делать, если ей не передать this, поэтому предположу, что все же хочется сделать замыкание
эта проблема обсуждалась здесь: http://rsdn.ru/forum/cpp.applied/5114972.flat
Здравствуйте, Nikita.Trophimov, Вы писали:
NT>Есть функция некоторого API, которая принимает в качестве аргумента указатель на свободную функцию. Ей необходимо передать нестатическую функцию-член.
"this" ты откуда брать собрался?
Если this передаётся как аргумент этой "свободной" функции — то можно сделать простейший враппер:
Result wrap(Foo *foo,int arg)
{
return foo->method(arg);
}
Если же откуда-то из глобальной области тогда вот это: live demo
Здравствуйте, Nikita.Trophimov, Вы писали:
NT>Есть функция некоторого API, которая принимает в качестве аргумента указатель на свободную функцию. Ей необходимо передать нестатическую функцию-член. NT>... NT>Существует ли вообще нормальный способ преобразовать указатель на функцию-член в указатель на свободную функцию или нет? Предполагаю, что нет, но мало ли кто-нибудь придумал решение.
В таких случаях хорошо, если в этом API предусмотрено передача в callback указателя на произвольный пользовательский контекст. В этом случае не сложно написать свою функцию-адаптер вокруг чего угодно и передать ее в качестве callback-а. Если же такой возможности не предусмотрено, то НОРМАЛЬНОГО способа использовать в качестве callback-ов функции члены и функциональные объекты не существует, извращений — сколько угодно. И остается только сказать "спасибо" за заботу разработчикам API.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Convert non-static member function pointer to function pointer
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Nikita.Trophimov, Вы писали:
NT>>Есть функция некоторого API, которая принимает в качестве аргумента указатель на свободную функцию. Ей необходимо передать нестатическую функцию-член.
EP>"this" ты откуда брать собрался? EP>Если this передаётся как аргумент этой "свободной" функции — то можно сделать простейший враппер: EP>
Здравствуйте, niXman, Вы писали:
EP>>live demo X>LWS был снова недоступен?
Я этот код добавил давно. По ссылке:
148 days 14 hours ago
По поводу LWS (в продолжение темы из другого топика):
1. Я понял почему у меня "www." было — это firefox сам добавлял. В итоге добавил закладку на панель, а то набираешь код, отправляешь — а он вылетает в трубу (потому "что www.")
2. Проверил совсем старые коды — да, они доступны. Но почему-то мне запомнилось, что был период когда они были недоступны.
3. Я зарегистрировался пару недель назад на LWS, а письмо до сих пор не пришло.
Re[3]: Convert non-static member function pointer to function pointer
Здравствуйте, saf_e, Вы писали:
_>В таких случаях можно использовать __COUNTER__, а чтобы не было коллизий при линковке, заворачивать в анонимный неймспейс.
Можно, но:
1. Это придётся весь вызов заворачивать в макрос (конечно не обязательно)
2. Пропадёт возможность реиспользования слота (может быть существенно, если объекты большие)
3. имхо, для примера — лучше явно показать что происходит, чтобы были видны грабли по поводу коллизий
Re[4]: Convert non-static member function pointer to function pointer
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, saf_e, Вы писали:
_>>В таких случаях можно использовать __COUNTER__, а чтобы не было коллизий при линковке, заворачивать в анонимный неймспейс.
EP>Можно, но: EP>1. Это придётся весь вызов заворачивать в макрос (конечно не обязательно) EP>2. Пропадёт возможность реиспользования слота (может быть существенно, если объекты большие) EP>3. имхо, для примера — лучше явно показать что происходит, чтобы были видны грабли по поводу коллизий
Как мне что-то подсказывает самый частый юз-кейс как раз использование уникальный слотов.
Просто я упомянул про способ облегчить себе жизнь (особенно если по файлу беспорядочно раскиданы выделения слотов). Ну а про коллизию имело смысл упомянуть, она не очевидна, а сайд-эффект весьма интересен
Re[5]: Convert non-static member function pointer to function pointer
Здравствуйте, saf_e, Вы писали:
_>Как мне что-то подсказывает самый частый юз-кейс как раз использование уникальный слотов. _>Просто я упомянул про способ облегчить себе жизнь (особенно если по файлу беспорядочно раскиданы выделения слотов).
Ничего против счётчика не имею. Во время написания ответа даже подумал об шаблонном счётчике
(без макросов, основанный на implementation specific extensions/bugs).
_>Ну а про коллизию имело смысл упомянуть, она не очевидна, а сайд-эффект весьма интересен
Кстати, другой подход:
1. аллоцировать пул функций при старте (например с помощью boost::mpl::for_each)
2. get_wrapper всегда будет возвращать следующую функцию из пула. если больше нет — то termintate или exception.
Re[6]: Convert non-static member function pointer to function pointer
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, saf_e, Вы писали:
_>>Как мне что-то подсказывает самый частый юз-кейс как раз использование уникальный слотов. _>>Просто я упомянул про способ облегчить себе жизнь (особенно если по файлу беспорядочно раскиданы выделения слотов).
EP>Ничего против счётчика не имею. Во время написания ответа даже подумал об шаблонном счётчике
(без макросов, основанный на implementation specific extensions/bugs).
Спасибо, любопытно, при попытке разобраться в тимплейтах мозг закипает
_>>Ну а про коллизию имело смысл упомянуть, она не очевидна, а сайд-эффект весьма интересен
EP>Кстати, другой подход: EP>1. аллоцировать пул функций при старте (например с помощью boost::mpl::for_each) EP>2. get_wrapper всегда будет возвращать следующую функцию из пула. если больше нет — то termintate или exception.
Сомнительное удовольствие
Re[4]: Convert non-static member function pointer to function pointer
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Я этот код добавил давно. По ссылке: EP>
EP>148 days 14 hours ago
да, я не обратил внимания.
EP>1. Я понял почему у меня "www." было — это firefox сам добавлял. В итоге добавил закладку на панель, а то набираешь код, отправляешь — а он вылетает в трубу (потому "что www.")
жесть %)
погуглю, что можно сделать с этим... возможно, в htaccess или в конфиге апатча что-то можно подкрутить...
EP>2. Проверил совсем старые коды — да, они доступны. Но почему-то мне запомнилось, что был период когда они были недоступны.
после запуска новой версии, был период, пока я перенес коды с прежней версии сервиса.
EP>3. Я зарегистрировался пару недель назад на LWS, а письмо до сих пор не пришло.
если гуглопочта, то она почему-то(при том, не всегда) кидает письмо активации в спам. хотя, адрес отправителя никогда ранее не использовался. я на нескольких форумах спрашивал, от чего такое может происходить. ничего вразумительного в ответ.
если письмо в спаме таки найдешь — срок его валидности все равно истек. в этом случае, напиши мне в ЛС и сообщи ник+почту, я активирую.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Convert non-static member function pointer to function pointer
Здравствуйте, Nikita.Trophimov, Вы писали:
NT>Существует ли вообще нормальный способ преобразовать указатель на функцию-член в указатель на свободную функцию или нет? Предполагаю, что нет, но мало ли кто-нибудь придумал решение.
ага — static
Весь мир — Кремль, а люди в нем — агенты
Re[5]: Convert non-static member function pointer to function pointer
Здравствуйте, niXman, Вы писали:
EP>>1. Я понял почему у меня "www." было — это firefox сам добавлял. В итоге добавил закладку на панель, а то набираешь код, отправляешь — а он вылетает в трубу (потому "что www.") X>жесть %)
вот я ввожу live, он дополняет до liveworkspace.org/ , нажимаю Enter и ссылка превращается в http://www.liveworkspace.org/
Если убрать "выделение автодополнения" либо ввести полностью http://liveworkspace.org — то без www.
X>погуглю, что можно сделать с этим... возможно, в htaccess или в конфиге апатча что-то можно подкрутить...
да, можно попробовать поставить редирект у www
EP>>3. Я зарегистрировался пару недель назад на LWS, а письмо до сих пор не пришло. X>если гуглопочта, то она почему-то(при том, не всегда) кидает письмо активации в спам. хотя, адрес отправителя никогда ранее не использовался. я на нескольких форумах спрашивал, от чего такое может происходить. ничего вразумительного в ответ. X>если письмо в спаме таки найдешь — срок его валидности все равно истек. в этом случае, напиши мне в ЛС и сообщи ник+почту, я активирую.
Да, именно в спаме и было, причём только в веб-интерфейсе (а я thunderbird использую). Надо настроить отдачу спама в imap/pop3 — а то вдруг что важное.
Письмо пришло 13 дней назад — только что активировал, всё ОК.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Письмо пришло 13 дней назад — только что активировал, всё ОК.
кстати да, после того как я начал получать сообщения о том, что письма попадают в спам, я убрал срок валидности активации.
EP>P.S. Кстати, в спаме ещё было нигерийское письмо
=)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: Convert non-static member function pointer to function pointer
Здравствуйте, saf_e, Вы писали:
_>Просто я упомянул про способ облегчить себе жизнь (особенно если по файлу беспорядочно раскиданы выделения слотов). Ну а про коллизию имело смысл упомянуть, она не очевидна, а сайд-эффект весьма интересен
Таки надёжнее сделать пул с нормальной аллокацией/деаллокацией...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Convert non-static member function pointer to function pointer
Здравствуйте, Nikita.Trophimov, Вы писали:
NT>Существует ли вообще нормальный способ преобразовать указатель на функцию-член в указатель на свободную функцию или нет? Предполагаю, что нет, но мало ли кто-нибудь придумал решение.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, saf_e, Вы писали:
_>>Как мне что-то подсказывает самый частый юз-кейс как раз использование уникальный слотов. _>>Просто я упомянул про способ облегчить себе жизнь (особенно если по файлу беспорядочно раскиданы выделения слотов).
EP>Ничего против счётчика не имею. Во время написания ответа даже подумал об шаблонном счётчике
(без макросов, основанный на implementation specific extensions/bugs).
_>>Ну а про коллизию имело смысл упомянуть, она не очевидна, а сайд-эффект весьма интересен
EP>Кстати, другой подход: EP>1. аллоцировать пул функций при старте (например с помощью boost::mpl::for_each) EP>2. get_wrapper всегда будет возвращать следующую функцию из пула. если больше нет — то termintate или exception.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Nikita.Trophimov, Вы писали:
NT>>Существует ли вообще нормальный способ преобразовать указатель на функцию-член в указатель на свободную функцию или нет? Предполагаю, что нет, но мало ли кто-нибудь придумал решение.
U>кстати, уже есть предложение в стандарт: U>http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3574.html
Если примут в С++ появится еще немного черной магии