![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ZeusAtVingrad |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Я так понимаю, что std::bind появилась в C++11?
А ранее его надо было искать в boost? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
в принципе да, в C++11(раньше он был в особом namespace std::tr1). Раньше был std::bind1st и std::bind2nd. Их, кстати, в твоём случае тоже хватит.
|
|||
|
||||
ZeusAtVingrad |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Другая проблема встала Тестовый пример.
Два класса (B и C) наследника от одного (А). У наследников, у обоих есть функции получения значения int. Они могут вернуть std::function<void(int)> - чтобы можно было вызвать эти функции. Кому надо - могут сохранить, чтобы вызвать потом (т.о. установить "связь" (link) для рассылки значений). Вопрос: можно ли из базового класса (A) как-то убрать упоминание int? Потому что сигнатуры функций у классов-наследников могут быть разными и базовому классу они неизвестны. Между собой классы-наследники уж как-нибудь договорятся (вызываемый сообщит об ошибке вызывающему, если у него не оказалось функции данного типа), но вот чтобы в базовом классе A не упоминались типы функций. Мне пока видится: заворачивать возвращаемую std::function<void(int)> во что-то вроде boost::any а вызывающий пусть сравнивает - совпадает ли тип с тем, что он ожидал или нет. Ещё вариант - гонять собственно сами значения через boost::any. Тогда и шаблон в базовом классе будет выглядеть как std::function<void(const boost::any&)> - и не важно какие именно типы нужны классам-наследникам. Этот путь не очень красивый архитектурно получается (в наследниках, при программировании уже собственно компонентов) и медленнее, чем гонять значения непосредственно в их собственных типах. Или может паттерн проектирования какой-то подходящий есть и я просто туплю? И второй вопрос - касаемо этих самых std::bind'ов и std::function. В стандартной библиотеке предусмотрен механизм защиты от удаления объекта - того, на который мы имеем std::function? Чтобы программа не падала, а исключение например выбрасывала, что, мол, объекта уже нет. Или что-то вроде этого. Или придётся самому колхозить? Это сообщение отредактировал(а) ZeusAtVingrad - 25.11.2013, 23:20 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Для того, что бы они договорились у них обоих должна присутствовать сигнатура на этапе компиляции. Тогда можно получение этой function завернуть в другой класс, у которого будет явно присутствовать тип в сигнатуре метода получения function. Все такие классы должны быть наследником одного базового (назовем его GenericSource, у него вообще не будет метода для получения function), и именно его должен возвращать A. Все конкретные сигнатуры должны быть как то перечислены (либо строкой, либо GUID'ом, либо можно попробовать явно вывести некую константу из типа), и в классе A должен быть метод для получения GenericSource по сигнатуре.
Нет Придется. Например введением общего менеджера на все объекты, который будет содержать общее оглавление всех объектов в системе (ведь как то они должны друг друга находить). Заодно он может и выступать в качестве посредника при вызове callback'ов. Так как он сам никуда не денется, то такие вызовы будут безопасны (конечно он сам должен отслеживать разпушение объектов-приемников и не пытаться передать вызов им) |
||||
|
|||||
ZeusAtVingrad |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Честно говоря - я ничего в коде не понял.
Зачем шаблон, параметр которого не используется? Зачем в нём константа Trait которая равна адресу статической функции приведённой к... size_t? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Для каждого типа шаблона будет сгенерена своя статическая функция (по 1 штуке на каждый тип). Ее адрес будет уникальный. Таким образом для каждого типа шаблона (сигнатуры вашего callback'а) получим уникальное число. |
|||
|
||||
ZeusAtVingrad |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Мда. Интересный подход.
А зачем приводить к site_t? И ещё - этот способ быстрее, чем std::type_info? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |