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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на метод, в качестве параметра шаблона 
:(
    Опции темы
Lazin
Дата 21.7.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В общем есть шаблон класса, получающий 2 параметра, тип владельца - Owner, и указатель на метод владельца - callback
Код

template<
    class Owner,
    void (Owner::*callback)( connection<Owner, callback>& )
>
class connection
{
    Owner owner_;
public:
    connection(Owner& o) : owner_(o) {}

    void do_work()
    {
        (owner.*callback)(*this);
    }
};

проблема в том, что callback должен получать ссылку на connection... так по крайней мере задумано smile , но это не работает... в общем нужен какой-то workaround...
PM MAIL Skype GTalk   Вверх
xvr
Дата 21.7.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Lazin @ 21.7.2008,  11:42)
В общем есть шаблон класса, получающий 2 параметра, тип владельца - Owner, и указатель на метод владельца - callback
Код

template<
    class Owner,
    void (Owner::*callback)( connection<Owner, callback>& )
>
class connection
{
    Owner owner_;
public:
    connection(Owner& o) : owner_(o) {}

    void do_work()
    {
        (owner.*callback)(*this);
    }
};

проблема в том, что callback должен получать ссылку на connection... так по крайней мере задумано smile , но это не работает... в общем нужен какой-то workaround...

У тебя в типе параметра callback'а получается бесконечная рекурсия. Нельзя ли сделать какой нибудь базовый класс для connection (не темплейтный вообще или по крайней мере без типа самого callback'а в параметрах темплейта) и передавать именно его в параметре callback'а ?

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


Эксперт
****


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

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



тогда уж  проще обойтись наследованием... smile 

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

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



Может, можно обойтись так:
Код
template<
    typename Owner,
    typename Conn,
    void (Owner::*callback)( Conn& )
>
class connection
{
    Owner owner_;
public:
    connection(Owner& o) : owner_(o) {}

    void do_work()
    {
        (owner_.*callback)(*this);
    }
};




--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Lazin
Дата 21.7.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ulysses4j @  21.7.2008,  12:14 Найти цитируемый пост)
Может, можно обойтись так:

так сделать можно, но тогда клиент сможет передать любой callback, что не очень хорошо...
PM MAIL Skype GTalk   Вверх
Lycifer
Дата 21.7.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почему в конструктор нельзя передать?

Цитата

Цитата(Ulysses4j @  21.7.2008,  12:14 Найти цитируемый пост)
Может, можно обойтись так:

так сделать можно, но тогда клиент сможет передать любой callback, что не очень хорошо... 

А если typeid использовать, ну и кидать исключения(разрушать объект)?
PM MAIL ICQ   Вверх
Lazin
Дата 21.7.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lycifer @  21.7.2008,  12:50 Найти цитируемый пост)
Почему в конструктор нельзя передать?

потому-что тип заранее не известен, класс должен работать с некоторым типом, и некоторым его методом, получающим ссылку на connection

Добавлено @ 13:01
Цитата(Ulysses4j @ 21.7.2008,  12:14)
Может, можно обойтись так:
Код
template<
    typename Owner,
    typename Conn,
    void (Owner::*callback)( Conn& )
>
class connection
{
    Owner owner_;
public:
    connection(Owner& o) : owner_(o) {}

    void do_work()
    {
        (owner_.*callback)(*this);
    }
};

как выяснилось нельзя, так как теперь, что-бы инстанцировать шаблон, нужно написать что-то вроде


Код

template<
    class Owner,
    class Param,
    void (Owner::*callback)( Param& )
>
class connection
{
    Owner owner_;
public:
    connection(Owner& o) : owner_(o) {}

    void do_work()
    {
        (owner.*callback)(*this);
    }
};

class client
{
    typedef connection<client, connection<client, ..!!WTF!!.., &client::do_work>, &client::do_work> connect;
......



Это сообщение отредактировал(а) Lazin - 21.7.2008, 13:02
PM MAIL Skype GTalk   Вверх
Ulysses4j
Дата 21.7.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

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



Да, действительно, тогда предлагаю не мучиться с нешаблонным параметром шаблона, а перетащить этот указатель на член в рантайм. Как предложил Lycifer:
Код
template<typename Owner>
class connection {
    typedef void (Owner::*CallbackT) (connection<Owner>&);

    Owner owner_;

    CallbackT callback_;

public:
    connection(Owner& o, CallbackT callback) : owner_(o), callback_(callback) {}

    void do_work() {
        (owner_.*callback_)(*this);
    }
};

class Client {
public:
    void do_work(connection<Client>& ) {}
};

int main() {
    Client cl;
    connection<Client> con(cl, &Client::do_work);
    con.do_work();
}



--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Lazin
Дата 21.7.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



в общем переписал по другому, теперь у меня callback поучает хэш, а не указатель на вызвавший объект, а по хэшу уже определяется объект... как-то так smile 
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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