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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение типов указателей на функции. 
V
    Опции темы
Elfet
Дата 23.11.2009, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Abyx,  я вроде весь нужный код-то выложил? smile Мне нужно как-то вызвать из метода одного класса, метод другого.


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


Опытный
**


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

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



наверное я был неправ.
результат bind имеет тип, отличный от void(*)(int)

так что надо 
либо использовать указатель на функцию-член,
либо шаблон, 
либо boost::function<void(int)> //или std::tr1::
PM MAIL   Вверх
Elfet
Дата 23.11.2009, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Abyx, а можно поподробнее как использовать шаблон для этого и буст?


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


Опытный
**


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

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



Elfet, 
шаблон, это
Код

template<typename Handler>
void Mesh::CollectSurrounding(int deep, Handler progress)
{
    ...
}

.................................

    sflib->CollectSurrounding(5, boost::bind(&MainWindow::Progress,this,_1) );

c function это
Код

void Mesh::CollectSurrounding(int deep, boost::function<void(int)> progress)
{
    ...
}

.................................

    sflib->CollectSurrounding(5, boost::bind(&MainWindow::Progress,this,_1) );


вариант с шаблоном в общем случае оптимальнее
PM MAIL   Вверх
Elfet
Дата 23.11.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Я вот такой ещё вариант придумал)))
Код

MainWindow * globalMainWindow;
void ProgressSingl(int value)
{
    globalMainWindow->Progress(value);
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    globalMainWindow = this;


Добавлено через 2 минуты и 49 секунд
Abyx, не совсем понял про вариант с шаблонами...


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


Опытный
**


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

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



Elfet, у типа Handler в шаблоне будет тип результата bind()
PM MAIL   Вверх
bsa
Дата 24.11.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Elfet, по хорошему, прежде чем браться за шаблоны неплохо бы было о них почитать немного...
Но я попытаюсь кратко объяснить...
когда ты создаешь шаблон, то компилятор будет пытаться каждый раз при его использовании подстроить под конкретную ситуацию. Например, ты написал шаблон:
Код
template<class T>
T myFunc(T x)
{...}
И его используешь так:
Код
myFunc(10);
myFunc(1.0);
myFunc("1234");
И каждый раз компилятор будет генерировать разные варианты реализации шаблона. В частности, сначала он вместо T подставит int и получится: int myFunc(int x){...}; затем double: double myFunc(double x) {...}; и в последнюю очередь - const char(&)[5] myFunc(const char (&x)[5]); тут вместо T подставлена ссылка на константный массив символов. Если в коде myFunc используется операции допустимые для всех типов, то все скомпилируется и будет работать (хотя не обязательно правильно - зависит от корректности работы конкретных операций)...
В твоем случае, мы задаем параметром шаблона тип объекта, к которому применим operator()(int). Т.е. когда ты пишешь так:
Код
template<class Handler>
void run(Handler handler)
{
   handler(10);
}
То ты предполагаешь, что функции run будет передан функциональный объект (тот для которого определен оператор(), это может быть даже простой указатель на функцию!), тип которого тебе на данный момент не известен, но будет известен на момент компиляции.
Функции вроде boost::bind (как и std::mem_fun, std::bind1st и пр.) создают функциональные объекты сложных типов (выглядят они жутко), о которых нужно знать только одно - у них есть operator(), который принимает необходимое количество параметром нужного типа. Использовать эти объекты вне шаблонных функций/методов - сущий мазохизм (да и неправильно это)... Но, можно воспользоваться boost::function, которая позволяет сформировать заранее тип функционального объекта, к которому будут автоматически приводиться все совместимые объекты (как реализовано - рассказывать не буду).
PM   Вверх
Elfet
Дата 24.11.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



bsa, ооо! спасибо!   smile 


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Elfet, если ответ на вопрос получен, то пометь тему решенной.

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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