Указатель на метод

В общем есть шаблон класса, получающий 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... так по крайней мере задумано  , но это не работает... в общем нужен какой-то workaround...
8 ответов

В общем есть шаблон класса, получающий 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... так по крайней мере задумано  , но это не работает... в общем нужен какой-то workaround...
У тебя в типе параметра callback'а получается бесконечная рекурсия. Нельзя ли сделать какой нибудь базовый класс для connection (не темплейтный вообще или по крайней мере без типа самого callback'а в параметрах темплейта) и передавать именно его в параметре callback'а ?


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


Может, можно обойтись так:
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);    }};


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


Почему в конструктор нельзя передать?
Цитата(Ulysses4j @  21.7.2008,  12:14 Найти цитируемый пост)Может, можно обойтись так:так сделать можно, но тогда клиент сможет передать любой callback, что не очень хорошо... 
А если typeid использовать, ну и кидать исключения(разрушать объект)?


Почему в конструктор нельзя передать?
потому-что тип заранее не известен, класс должен работать с некоторым типом, и некоторым его методом, получающим ссылку на connectionДобавлено @ 13:01
Может, можно обойтись так:
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;......


Да, действительно, тогда предлагаю не мучиться с нешаблонным параметром шаблона, а перетащить этот указатель на член в рантайм. Как предложил 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();}


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