| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Указатель на функцию класса |
| Автор: Merlin_ua 13.8.2014, 22:58 | ||
Пример:
Пример сильно упрощен. Суть - реализовать динамическую подмену метода. Нужно в зависимости от значения, передаваемого в конструкторе, присоить f1 указатель на одну из функцию-метод этого же класса. Естественно код не работает. Как решить подобную задачу? |
| Автор: Lukkoye 13.8.2014, 23:28 | ||
http://rextester.com/KGK12631
Так же рекомендую ознакомиться: http://forum.vingrad.ru/forum/topic-378684.html |
| Автор: Cheloveck 14.8.2014, 00:35 | ||
| Можно юзать паттарн https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29, если не пугает небольшой оверхед с использованием виртуальных вызовов. Ещё есть кашерный способ с использованием шаблонных функторов. Правда, не всегда можно использовать.
|
| Автор: Cheloveck 15.8.2014, 00:25 | ||||||||||
Это 1 байт против Ваших 8-ми (на 64-разрядных машинах): http://codepad.org/lj2HBuRV
Смотрим на асм, который выдаёт g++ и не наблюдаем оверхеда
А всё потому, что всё волшебным способом заинлайнилось.
Не совсем понятно предложение. Но исходя из вышеперечисленных соображения и возможность оборачивать свободные функции в структуры макросом, не считаю этот пункт хоть сколько-нибудь значащим. И да
http://ideone.com/Pn1xQ2 |
| Автор: Lukkoye 15.8.2014, 01:13 | ||
Который можно было бы и не тратить совершенно зазря и на пустом месте. Против каких моих 8ми? В моем примере вообще нет мемберов. inline это конечно хорошо, только не факт в вашем случае. в случае с параметром шаблона - факт.
boost::function/boost::bind с вами не согласны. Было время, я рассматривал различные варианты реализаций делегатов на плюсах (с++03). И собственный велосипед так же имеется. Я провел ряд сравнительных тестов. Все аналоги уступали бустовскому делегату. Не сказать, что сильно, но все таки велосипеды его не догоняли. В бустовском делегате не использовались аргументы функций, для передачи и сохранения объекта указателя на функцию-член, то есть там не делалось динамической связки. Вместо этого делалась статическая связка, путем передачи указатель на функцию-член через параметр шаблона. Что и делало его столь быстрым в работе. Ваше "и да" ---> std::function итак уже является тонкой оберткой над функторами. Высоко технологичное, черезвычайно быстрое средство запуска удаленных функций. Факт его использования делает ненужной вашу собственную обертку в принципе. Она получается избыточным велосипедом с квадратными колесами. Другое дело сам std::function. Вы можете нацеливать его куда угодно - на любые функции, и методы, с любыми именами,с различным количеством заранее прибинденных аргументов, бла бла бла. Ваша обертка в этом смысле прибита гвоздями к operator() с определенной сигнатурой. Теперь попробуйте нарисовать модель, которую подобно std::function можно нацеливать на самые разные функции, и биндить аргументы. Только имейте ввиду - если для классов, вы будете отдельно сохранять объект, и отдельно указатель на функцию-член, и делать динамическую связку - вы просадите рантайм, и ваш велосипед никогда по скорости не догонет std::function/std::bind. |