Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на функции-члены, Указатели на функции-члены 
:(
    Опции темы
mzconcept
Дата 12.5.2008, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как реализовать на Visual C++ указатель на функцию-член класса? (в C++ Builder это реализовано с помощью слова __closure)
PM MAIL   Вверх
Andrey44
Дата 12.5.2008, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 12
Всего: 26



Код

void (CSomeDlg::*Funck)() = &CSomeDlg::SomeFunck;



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Lazin
Дата 12.5.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



или так:

Код

class A {
    void foo(int param) {}
};

A* inst = new A;

boost::function<void (int)> func = boost::bind(&A::foo, inst, _1);

func(0);//эквивалентно inst->foo(0);

PM MAIL Skype GTalk   Вверх
Earnest
Дата 12.5.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Это не эквивалентные вещи.
Если строго следовать вопросу, то как написал Andrey44:  
 void (CSomeDlg::*Funck)() = &CSomeDlg::SomeFunck; 

Но поскольку автор упомянул closure, то понятно, что ему нужно нечто другое. Это не совсем указатель на функцию-член, а скорее делегат. При вызове функции по чистому указателю нужно будет указывать объект. А чтобы получить готовый вызов - нужно использовать boost, как показал Lazin, ибо в стандартном C++ таких возможностей пока нет.



--------------------
...
PM   Вверх
Rififi
Дата 12.5.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 2
Всего: 36



в tr1 есть
поддерживается в vs2008 with feature pack
PM MAIL   Вверх
mzconcept
Дата 15.5.2008, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробывал так: 
Код

class A {
public:
    typedef void (A::*pf)();
    void fA(){
       MessageBox(NULL, L"fA", NULL, MB_OK);
    }
};
class B : public A {
public:
    pf pff;
    void  fB(){
       MessageBox(NULL, L"fB", NULL, MB_OK);
    }
};
class C : public A{
public:
    void fC() {
       MessageBox(NULL, L"fC", NULL, MB_OK);
    }
};

...

    B b;
    b.pff = &A::fA;
    b.pff = &B::fB; //Error
    b.pff = &C::fC; //Error

    (b.*b.pff3)();


жаль, что не работает...


Потом попробывал второй вариант
Код

typedef void (myfunc)(int a);
class A {
public:
    void foo(int param) {
        
    }
};

...

    A* inst = new A;
    boost::function<myfunc> func = boost::bind(&A::foo, inst, _1);
    func(0);


Работает!!! Одно но, приходиться тянуть библиотеку в 50 метров...

Может попробуем реализовать общими усилиями эту часть буста?
PM MAIL   Вверх
Earnest
Дата 15.5.2008, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Какую библиотеку? function вся реализована в хедерах. Да, текста там много, но "своими силами" получится не меньше, но хуже... ты бы в исходники заглянул, прежде чем заикаться о другой реализации...


--------------------
...
PM   Вверх
Lazin
Дата 15.5.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



Цитата(mzconcept @  15.5.2008,  07:51 Найти цитируемый пост)
Работает!!! Одно но, приходиться тянуть библиотеку в 50 метров...
Может попробуем реализовать общими усилиями эту часть буста? 

50 метров? кажется ты еще его не собрал  smile 
зы
уже написали что это входит в tr1
PM MAIL Skype GTalk   Вверх
mzconcept
Дата 15.5.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попытался обойти boost ... вот что получилось:
Код

typedef void (*VMyClick)(void *Owner, int A);

template <class T> class CEvent
{
public:
    void *Owner;
    T Event;
    void Set(void *AOwner, T AEvent)
    {
        Owner = AOwner;
        Event = AEvent;
    }
};


class CApp1
{
public:
...
  static void stClick(void *Owner, int a) 
  {
      ((CApp1*)Owner)->Click(1);
  }
  void Click(int a) 
  {
      int b = a;
  }
};

...

    CEvent<VMyClick> vf;
    vf.Set(App1, stClick);
...
    if (vf.Event != NULL) vf.Event(vf.Owner, 1);


Конечно, недостатком является то, что необходимо описывать дополнительную статическую функцию наподобии static void stClick(...). Зато удобно расспространять исходники своей программы, отпадает необходимость в бусте...

Может кто-нибудь даст совет по оптимизации данного кода?
PM MAIL   Вверх
Lazin
Дата 15.5.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



так и не понял в чем проблема, ты что, рассчитываешь написать программу не использовав ни одной библиотеки что-бы "удобно расспространять исходники своей программы"?
ps
в твоем случае больше подойдет boost::signal, так как там сигналы автоматически отсоединяются от слотов, в случае удаления объекта который их предоставляет.. твой вариант небезопасен, так как ты там систему типов пытаешься обойти (void *Owner;)
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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