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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неоднозначность при специализации, и еще один маленький вопросик 
V
    Опции темы
boostcoder
Дата 3.3.2011, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



всем доброй ночи.
имеем код:
Код

#include <boost/signals.hpp>
#include <boost/bind.hpp>
#include <iostream>

/***************************************************************************/

typedef boost::signal<void()> sig1;
typedef boost::signal<void(int)> sig2;
typedef boost::signal<void(const char*, int)> sig3;

/***************************************************************************/

template<size_t>
struct real_connect;

template<>
struct real_connect<0> {
   template<typename Signal, typename Obj, typename... Args>
   static void apply(Signal& signal, Obj* obj, void(Obj::*method)()) {
      signal.connect(boost::bind(method, obj));
   }
};

template<>
struct real_connect<1> {
   template<typename Signal, typename Obj, typename... Args>
   static void apply(Signal& signal, Obj* obj, void(Obj::*method)(Args...)) {
      signal.connect(boost::bind(method, obj, _1));
   }
};

template<>
struct real_connect<2> {
   template<typename Signal, typename Obj, typename... Args>
   static void apply(Signal& signal, Obj* obj, void(Obj::*method)(Args...)) {
      signal.connect(boost::bind(method, obj, _1, _2));
   }
};

/***************************************************************************/

/** free-function for connect signals with user handlers */
template<typename Signal, typename Obj, typename... Args>
void connect(Signal& signal, Obj* obj, void(Obj::*method)(Args...)) {
   real_connect<sizeof...(Args)>::apply(signal, obj, method);
}

/***************************************************************************/

struct impl {
   sig1 s1;
   sig2 s2;
   sig3 s3;
};

struct type1 {
   type1() {
      connect(im.s1, this, &type1::m1);
      connect(im.s2, this, &type1::m2);
      connect(im.s3, this, &type1::m3);
   }
   void m1() {
      std::cout << "type1::m1()" << std::endl;
   }
   void m2(int i) {
      std::cout << "type1::m2(" << i << ")" << std::endl;
   }
   void m3(const char* s, int i) {
      std::cout << "type1::m3(" << s << ", " << i << ")" << std::endl;
   }
   
   impl im;
};

/***************************************************************************/

int main() {
   type1 t1;
   t1.im.s1();
   t1.im.s2(33);
   t1.im.s3("44", 55);
}

/***************************************************************************/

http://liveworkspace.org/code/91ac74abc456...f69fb9175b3b526

с кодом все хорошо. он даже работает.
НО! - если строку 59 изменить следующим образом: connect(im.s2, this, &type1::m1);
то код так же скомпилится, хотя сигнатуры сигнала и метода разные.

почему такое происходит? и от чего?

спасибо.

Это сообщение отредактировал(а) boostcoder - 3.3.2011, 02:58
PM WWW   Вверх
mes
Дата 3.3.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  3.3.2011,  01:34 Найти цитируемый пост)
почему такое происходит? и от чего?

sorry, но где у Вас завязка сигнатуры метода на сигнатуру сигнала ?!
а если они не связаны, то почему бы не компилиться ?

Цитата(boostcoder @  3.3.2011,  01:34 Найти цитируемый пост)
с кодом все хорошо. он даже работает.

редко когда в таких случаях задаются вопросы smile

Цитата(boostcoder @  3.3.2011,  08:27 Найти цитируемый пост)

как решить задачу ?

сделать структуру конвертер, меняющую тип сигнала, на тип   метода.. 
поможет boost.function_types..

smile

Это сообщение отредактировал(а) mes - 3.3.2011, 09:44


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


pattern`щик
****


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

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



Цитата(mes @  3.3.2011,  09:44 Найти цитируемый пост)
где у Вас завязка сигнатуры метода на сигнатуру сигнала ?!

вот же:
void(Obj::*method)(Args...)

т.е. method - указатель на мною указываемый метод класса.
тут даже две проверки:
1. при использовании boost::bind(), он же и проверяется соответствие равенства кол-ва аргументов кол-ву плейсхолдеров.
2. результат bind`а используется для connect(), который в свою очередь тоже проверяет соответствие сигнатуры функционального объекта.

или что?

Добавлено через 1 минуту и 34 секунды
Цитата(mes @  3.3.2011,  09:44 Найти цитируемый пост)
сделать структуру конвертер, меняющую тип сигнала, на тип   метода..

мне не нужно менять тип сигнала. и нельзя.
PM WWW   Вверх
mes
Дата 5.3.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.3.2011,  19:54 Найти цитируемый пост)
тут даже две проверки:
1. при использовании boost::bind(), он же и проверяется соответствие равенства кол-ва аргументов кол-ву плейсхолдеров.
2. результат bind`а используется для connect(), который в свою очередь тоже проверяет соответствие сигнатуры функционального объекта.

первая проверка не при чем..  Вы лишь по кол-ву аргументов выбираете подходящий бинд.. 
а вторая да.. я не заметил, что Вы в apply делаете signal.connect.. сорри, что ввел в заблуждение.. 
интуитивно ориентировался на предыдущий  код из соседних тем и не приглядывался к текущему.. 
сейчас гляну дальше.. 




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


pattern`щик
****


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

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



Цитата(mes @  5.3.2011,  22:47 Найти цитируемый пост)
первая проверка не при чем..  Вы лишь по кол-ву аргументов выбираете подходящий бинд..

но даже она проходит!
PM WWW   Вверх
mes
Дата 5.3.2011, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



хм.действительно у boost.signal есть проблема (или это фича?) с сигнатурами слотов..
интегральные или плавающие типы аргументов  аргументы сигнала могут быть пропущены у слота ..
т.е. такое верно :
Код

void f() {}

boost::signal<int, float> s;
s.connect (boost::bind(f));
s(3,4);

 smile

Цитата(mes @  5.3.2011,  21:55 Найти цитируемый пост)
или это фича?

в документации ничего не нашел на этот счет.. 


Это сообщение отредактировал(а) mes - 6.3.2011, 15:34


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


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


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

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



Цитата(mes @  5.3.2011,  21:55 Найти цитируемый пост)
в документации ничего не нашел на этот счет.. 

неудивительно, ибо сами сигналы оказывается не при чем.. 
вот так тоже работает :
Код

void f() {}
boost::bind(f)(3,5.0);




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


pattern`щик
****


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

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



Цитата(mes @  5.3.2011,  23:26 Найти цитируемый пост)
неудивительно, ибо сами сигналы оказывается не при чем.. 
вот так тоже работает

уменяистерика smile

Добавлено через 36 секунд
никогда не замечал подобной проблемы с байндами
PM WWW   Вверх
mes
Дата 6.3.2011, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.3.2011,  23:11 Найти цитируемый пост)
уменяистерика 

я тоже "восхищен"  smile 

Цитата(boostcoder @  5.3.2011,  23:11 Найти цитируемый пост)
никогда не замечал подобной проблемы с байндами 

аналогично.. и главное что документация по bind`у, тоже упорно скрывает сей факт.. 


Это сообщение отредактировал(а) mes - 6.3.2011, 00:15


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


pattern`щик
****


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

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



может столь странное поведение происходит только на gcc ?
у Вас нет под рукой MSVC ?
PM WWW   Вверх
mes
Дата 6.3.2011, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.3.2011,  23:27 Найти цитируемый пост)
у Вас нет под рукой MSVC ? 

нету :(

Добавлено через 2 минуты и 49 секунд
но в gcc не только у boost::bind, но и у std::bind..

Это сообщение отредактировал(а) mes - 6.3.2011, 00:29


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


pattern`щик
****


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

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



Цитата(mes @  5.3.2011,  22:55 Найти цитируемый пост)
или это фича?

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


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


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

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



Цитата(boostcoder @  5.3.2011,  23:35 Найти цитируемый пост)
вряд ли... не логично. 

посмотрел код.. все таки фича.. точнее "дырка" в концепции.. хотя сам бинд получается не при чем..

при конструировании бинда создается список привязанных аргументов и плейсхолдеров потом на него "накладывается" список аргументов вызова, при этом из последнего выбираются элементы соответсвующие плейсхолдрам первого.. в связи с тем, что плейсхолдер может указывать на любой элемент второго списка, у bind`a нет права его ограничивать..а проверка, чтоб кол-во элементов не превышала "индекс " наибольшего плейсхолдера просто излишняя.. 

т.е. фактически нужно для такой возможности :
Код

 std::bind(f,_7) (0,1,2,3,4,5,6,7,8,9);


Добавлено через 5 минут и 31 секунду
Цитата(mes @  6.3.2011,  00:17 Найти цитируемый пост)
посмотрел код.. 

но буст все таки ужасен.. на ночь изучать его исходники, все равно что ммм.. смотреть триллер перед сном  smile  smile  smile 



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


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


pattern`щик
****


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

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



Цитата(mes @  6.3.2011,  01:17 Найти цитируемый пост)
все таки фича

интересно...а много людей знают об этом? ;)
PM WWW   Вверх
mes
Дата 6.3.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



остановился на том, что это "вина"/"фича" bind`a :

http://liveworkspace.org/code/8f09320bfa47...afbcd97e8bcb9cc

и все ж непонятно, почему в документации этот "спорный" и не очевидный момент явно не указан..  smile 
 smile 

P.S.
Цитата(mes @  6.3.2011,  10:43 Найти цитируемый пост)
могут быть только интегральные и плавающие

видать на ночь неправильно эксперимент поставил,  так как в вышеприведенном примере подобного не наблюдается.. подправил пост..

Это сообщение отредактировал(а) mes - 6.3.2011, 15:37


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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