Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> два вопроса по boost::bind() 
V
    Опции темы
boostcoder
Дата 27.11.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Леопольд, много слов...
вот суть вопроса:
Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>

typedef boost::signals2::signal<void(int)> sig_t;
struct type {
   void method(int) {}
};

template<typename T>
void connect(T* object, sig_t& sig) {
   sig.connect(
      boost::bind(static_cast<T::sig_t::signature_type>(&T::/* ??? */), object, _1)
   );
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
}

http://liveworkspace.org/code/628b73efe64c...17676ab3d54c8cc

спасибо.

Добавлено через 3 минуты и 25 секунд
GoldFinch, ну вы вывели новый тип, что по сути, то же что имя метода.
Цитата(GoldFinch @  27.11.2010,  16:14 Найти цитируемый пост)
еще можно получать met_t

это что?

Добавлено через 4 минуты и 32 секунды
ааа, понял.

PM WWW   Вверх
Леопольд
Дата 27.11.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(boostcoder @  27.11.2010,  16:14 Найти цитируемый пост)
вот суть вопроса:
Если бы я понял вопрос из кода... А код, вроде бы и не изменился. smile


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 16:32


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 27.11.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  27.11.2010,  15:31 Найти цитируемый пост)
Если бы я понял вопрос из кода... А код, вроде бы и не изменился. 


метод можно вызвать по адресу, а можно по имени..  но  нельзя (напрямую) передать имя для вызова..



--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 27.11.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(mes @  27.11.2010,  19:14 Найти цитируемый пост)
метод можно вызвать по адресу
Оказалось что не подходит такой вариант.
Код
#include <boost/signals2.hpp>
#include <boost/bind.hpp>
typedef boost::signals2::signal<void(int)> sig_t;
struct type {
   void method(int) {}
};
template<typename T, typename F>
void connect(T& object, F f, sig_t& sig) {
   sig.connect(
      boost::bind(f, object, _1)
   );
}
int main() {
   type t;
   sig_t sig;
   connect(t, &type::method, sig);
   
   return 0;
}
Цитата(boostcoder @  27.11.2010,  15:13 Найти цитируемый пост)
Леопольд, проблема та же остается. нужно знать имя метода. а мне оно не известно. есть только сигнатура, и уверенность в том, что это сигнатура метода T. 
Т.е. ни имени, ни адреса...


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 19:41


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 27.11.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  27.11.2010,  18:41 Найти цитируемый пост)
Оказалось что не подходит такой вариант.

я в курсе.. я для Вас пояснял , что требуется для тс smile



--------------------
PM MAIL WWW   Вверх
mes
Дата 27.11.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот некоторый ужасТный пример..
http://liveworkspace.org/code/c26e7259dec9...5a1ef3fedddee8b

который напрашивает вопрос, а чего такие опасения насчет лишнего вызова (с деливери)
из за которого Вы лишаете себя, некоторых преимуществ.. и в частности
1. автоматическое приведение параметров
2. возможность использовать параметры по умолчанию в конечной функции
3.. 

Это сообщение отредактировал(а) mes - 27.11.2010, 20:01


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 27.11.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(mes @  27.11.2010,  19:46 Найти цитируемый пост)
я в курсе.. я для Вас пояснял , что требуется для тс
Всё равно не понял. По адресу нельзя, по имени нельзя. Как тогда? В С++ я других спосоbов не знаю. Всё равно всё сведётся к какому ниbудь имени.
Цитата(mes @  27.11.2010,  20:01 Найти цитируемый пост)
вот некоторый ужасТный пример..
Опять же, в этом примере вызов по адресу, адрес выдаёт функция у который, опять же, есть имя (точнее тут уже два имени, есть ещё имя шаbлона - f1, f2)... В чём тут отличие, кроме очевидного усложнения кода?


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 20:16


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 27.11.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  27.11.2010,  19:01 Найти цитируемый пост)
Всё равно не понял. По адресу нельзя, по имени нельзя. Как тогда?

Код

o.func(); // по имени
o.func_addr()// по адресу 

теперь мы хотим передать для вызова:
Код

void  call (void (A::*)() ) // адрес передать можем, как в обычную функцию.. так и в шаблон..
 ?? // а вот по имени передать нельзя

1. можно написать прокси обертку, которая будет для нужного имени возвращать адрес, 
но этот способом обладает целым рядом недостатков , часть из которых упомянута выше..
2. а можно сделать прокси обертку, которая для по условному (заранее зарезервированному) имени будет вызывать нужный метод..  т.е. получиться отражение имени типа, на имя метода.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 27.11.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Леопольд @  27.11.2010,  19:41 Найти цитируемый пост)
ни адреса...

нет-нет. извините что ввел в заблуждение. адрес тоже известен.

Добавлено через 6 минут и 43 секунды
Цитата(mes @  27.11.2010,  20:01 Найти цитируемый пост)
вот некоторый ужасТный пример..
http://liveworkspace.org/code/c26e7259dec9...5a1ef3fedddee8b

 smile 

Цитата(mes @  27.11.2010,  20:01 Найти цитируемый пост)
который напрашивает вопрос, а чего такие опасения насчет лишнего вызова (с деливери)

не в этом причина. просто подвернулась ситуация, которую хочется понять. чтоб не напороться еще раз.

Цитата(boostcoder @  27.11.2010,  20:14 Найти цитируемый пост)
адрес тоже известен. 

т..е адрес объекта.


что-то я сегодня торможу по полной...


PM WWW   Вверх
Леопольд
Дата 27.11.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(mes @  27.11.2010,  20:14 Найти цитируемый пост)
2. а можно сделать прокси обертку, которая для по условному (заранее зарезервированному) имени 
 Опять же, по имени. Почему просто не сделать функцию в каждом классе с зарезерованным именем, которая bудет возвращать boost::function с нужной сигнатурой?



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 27.11.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  27.11.2010,  20:14 Найти цитируемый пост)
подвернулась ситуация, которую хочется понять. чтоб не напороться еще раз.

до сих пор никогда не сталкивался с подобной надобностью.

Добавлено через 1 минуту и 17 секунд
Цитата(Леопольд @  27.11.2010,  20:22 Найти цитируемый пост)
с зарезерованным именем

Цитата(Леопольд @  27.11.2010,  20:22 Найти цитируемый пост)
с нужной сигнатурой?

потому что нет правила которое бы описывало возможные комбинации/варианты/сигнатуры и т.д...
PM WWW   Вверх
Леопольд
Дата 27.11.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



boostcoder, это в продолжение вашей неосиливаемой мегаветки про "типозависимые хандлеры"? Вы, видимо, уже какую-то терминологию выраbотали, которой я не знаю...

Это сообщение отредактировал(а) Леопольд - 27.11.2010, 20:28


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 27.11.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



пока получил это:
Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <boost/function_types/parameter_types.hpp>
#include <boost/type_traits.hpp>
#include <typeinfo>
#include <iostream>

typedef boost::signals2::signal<void(int)> sig_t;

struct type {
   void method(int v) {
      std::cout << v << std::endl;
   }
};

template<typename T, typename S>
void connect(T* object, S& sig) {
   typedef typename S::result_type(T::*mp)(typename S::argument_type);
   mp m = ???
//   (object->*m)(3);
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
   sig(3);
}

http://liveworkspace.org/code/c070cebbee78...383fcbd17fb2b15
PM WWW   Вверх
mes
Дата 27.11.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  27.11.2010,  19:14 Найти цитируемый пост)
не в этом причина. просто подвернулась ситуация, которую хочется понять. чтоб не напороться еще раз.

для начала забудем про сигналы.. чтоб облегчить задачу.. 

вот пример в стиле "прокси":
http://liveworkspace.org/code/1b953fdb5fc2...7057ac80a0e28b9
попробуйте переписать его в стиле "с возвращением адреса"
smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 27.11.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Леопольд @  27.11.2010,  20:28 Найти цитируемый пост)
это в продолжение вашей неосиливаемой мегаветки про "типозависимые хандлеры"?

форк smile 
Цитата(Леопольд @  27.11.2010,  20:28 Найти цитируемый пост)
видимо, уже какую-то терминологию выраbотали, которой я не знаю...

"не как у всех" smile

Добавлено через 10 минут и 44 секунды
Цитата(mes @  27.11.2010,  20:35 Найти цитируемый пост)
вот пример в стиле "прокси":
http://liveworkspace.org/code/1b953fdb5fc2...7057ac80a0e28b9
попробуйте переписать его в стиле "с возвращением адреса"

а смысл? тут и так все понятно. или я чего-то не понял?
PM WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1214 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.