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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> два вопроса по boost::bind() 
V
    Опции темы
boostcoder
Дата 27.11.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Всем доброго дня.
В следующем коде вываливается куча ошибок:
Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>

typedef boost::signals2::signal<void(int)> sig_t;

struct type {
   void method(int) {}
};

template<typename T>
void connect(T* object, sig_t& sig) {
   sig.connect(
      boost::bind(&type::method, object)
   );
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
}

http://liveworkspace.org/code/97ad4f6a84f1...8b759d09e807268
Цитата

In file included from boost/mem_fn.hpp:22:0,
from boost/function/detail/prologue.hpp:18,
from boost/function.hpp:24,
from boost/signals2/signal.hpp:18,
from boost/signals2.hpp:19,
from source.cpp:1:
boost/bind/mem_fn.hpp: In member function 'void(int)& boost::_mfi:smilem<void(int), type>::operator()(type *)
    const':
boost/bind/bind.hpp:243:60:   instantiated from 'void (&)(
        int
    ) boost::_bi::list1<boost::_bi::value<type *> >::operator()(
        boost::_bi::type<void (&)(int)>, boost::_mfi:smilem<void(int), type> &, boost::_bi::list1<int &> &, long int
    )'
boost/bind/bind_template.hpp:32:59:   instantiated from 'boost::_bi::bind_t<
        void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
    >::void (&)(
        int
    ) boost::_bi::bind_t<
        void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
    >::operator()(int &)'
boost/function/function_template.hpp:153:11:   instantiated from 'static void boost::detail::function
    ::void_function_obj_invoker1<
        boost::_bi::bind_t<
            void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
        >, void, int
    >::invoke(boost::detail::function::function_buffer &, int)'
boost/function/function_template.hpp:913:60:   instantiated from 'void boost::function1<void, T1>
    ::assign_to(
        boost::_bi::bind_t<
            void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *>>
        >
    )'
boost/function/function_template.hpp:722:7:   instantiated from 'boost::function1<
        void, T1
    >::function1(
        boost::_bi::bind_t<
            void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
        >, boost::enable_if_c<
            boost::type_traits::ice_not<
                boost::is_integral<
                    boost::_bi::bind_t<
                        void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
                    > 
                >::value
            >::value, int
        >::ame boost::enable_if_c<
            boost::type_traits::ice_not<
                boost::is_integral<
                    boost::_bi::bind_t<
                        void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
                    > 
                >::value
            >::value, int
        >::type = int
    )'
boost/function/function_template.hpp:1064:16:   instantiated from 'boost::function<
        void(int)
    >::function(
        boost::_bi::bind_t<
            void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
        >, boost::enable_if_c<
            boost::type_traits::ice_not<
                boost::is_integral<
                    boost::_bi::bind_t<
                        void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
                    > 
                >::value
            >::value, int
        >::ame boost::enable_if_c<
            boost::type_traits::ice_not<
                boost::is_integral<
                    boost::_bi::bind_t<
                        void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
                    > 
                >::value
            >::value, int
        >::type = int
    )'
boost/function/function_template.hpp:1105:5:   instantiated from 'boost::enable_if_c<
        boost::type_traits::ice_not<
            boost::is_integral<
                boost::_bi::bind_t<
                    void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
                > 
            >::value
        >::value, boost::function<void(int)> &
    >::ame boost::enable_if_c<
        boost::type_traits::ice_not<
            boost::is_integral<
                boost::_bi::bind_t<
                    void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
                > 
            >::value
        >::value, boost::function<R(int)> &
    >::type = boost::function<void(int)> & boost::function<void(int)>::operator=(
        boost::_bi::bind_t<
            void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *>>
        >
    )'
boost/signals2/detail/slot_template.hpp:156:9:   instantiated from 'void boost::signals2::slot<
        void({int} ...), boost::function<void(int)> 
    >::init_slot_function(
        const boost::_bi::bind_t<
            void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
        > &
    )'
boost/signals2/detail/slot_template.hpp:81:9:   instantiated from 'boost::signals2::slot<
        void({int} ...), boost::function<void(int)> 
    >::slot(
        const boost::_bi::bind_t<
            void (&)(int), boost::_mfi:smilem<void(int), type>, boost::_bi::list1<boost::_bi::value<type *> > 
        > &
    )'
source.cpp:12:4:   instantiated from 'void
    connect(type *, boost::signals2::signal<void(int)> &)'
source.cpp:20:19:   instantiated from here
boost/bind/mem_fn.hpp:342:23: error: invalid use of non-static member function

Build finished with errors

не понимаю в чем проблема?
спасибо.
PM WWW   Вверх
Леопольд
Дата 27.11.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Плейсхолдер забыл.
Код
#include <boost/signals2.hpp>
#include <boost/bind.hpp>

typedef boost::signals2::signal<void(int)> sig_t;

struct type {
   void method(int) {}
};

template<typename T>
void connect(T* object, sig_t& sig) {
   sig.connect(
      boost::bind(&T::method, object, _1)
   );
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
}


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 13:37


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 27.11.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



там же написано :
Цитата

 invalid use of non-static member function
 smile 
 
Цитата(Леопольд @  27.11.2010,  12:35 Найти цитируемый пост)
, _1)

smile

P.S. хотя у шаблона ошибки длинные..стоит смотреть в самый конец, обычно суть там скрыта.. 
smile

Это сообщение отредактировал(а) mes - 27.11.2010, 13:41


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 27.11.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  27.11.2010,  13:11 Найти цитируемый пост)
два вопроса по boost::bind() 
два вопроса, два ответа smile

Это сообщение отредактировал(а) Леопольд - 27.11.2010, 13:46


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


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


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

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



Цитата(Леопольд @  27.11.2010,  12:44 Найти цитируемый пост)
два вопроса, два ответа 

уже  три   четыре.. 
smile


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


pattern`щик
****


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

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



Цитата(Леопольд @  27.11.2010,  13:35 Найти цитируемый пост)
Плейсхолдер забыл.

мдя.. smile 

Цитата(Леопольд @  27.11.2010,  13:44 Найти цитируемый пост)
два вопроса, два ответа

это был первый вопрос ;)
внимание, вопрос №2:
нужно создать функциональный объект с методом класса, при том что известен тип класса, и сигнатура метода. имя метода неизвестно. такое возможно?
Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>

typedef boost::signals2::signal<void(int)> sig_t;

struct type {
   void method(int) {}
};

template<typename T>
void connect(T* object, sig_t& sig) {
   sig.connect(
      boost::bind(static_cast<T::sig_t::signature_type>(&T::/* ??? */), object, _1)
   );
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
}

http://liveworkspace.org/code/628b73efe64c...17676ab3d54c8cc
PM WWW   Вверх
mes
Дата 27.11.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  27.11.2010,  13:19 Найти цитируемый пост)
имя метода неизвестно

разгрузить через тип.. см. для чего используется delivery(он же proxy)  из соседней темы..

Добавлено через 1 минуту и 22 секунды
сейчас ухожу..как приду (если до этого момента не получится) напишу.. 


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


pattern`щик
****


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

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



Цитата(mes @  27.11.2010,  14:32 Найти цитируемый пост)
разгрузить через тип

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


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


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

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



так же может помочь гугль по template traits

Добавлено через 1 минуту и 27 секунд
Цитата(boostcoder @  27.11.2010,  13:33 Найти цитируемый пост)
создавать промежуточный методы. 

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



--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 27.11.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  27.11.2010,  14:19 Найти цитируемый пост)
нужно создать функциональный объект с методом класса, при том что известен тип класса, и сигнатура метода. имя метода неизвестно. такое возможно?
Может не измудряться и сделать как то так?
Код
#include <boost/signals2.hpp>
#include <boost/bind.hpp>

typedef boost::signals2::signal<void(int)> sig_t;

struct type {
   void method(int) {}
};

template<typename T, typename F>
void connect(T& object, F f, sig_t& sig) {
   sig.connect(
      boost::bind(f, object, _1)
   );
}

int main() {
   type t;
   sig_t sig;
   connect(t, &type::method, sig);
   
   return 0;
}



Это сообщение отредактировал(а) Леопольд - 27.11.2010, 15:09


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 27.11.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Леопольд, проблема та же остается. нужно знать имя метода. а мне оно не известно. есть только сигнатура, и уверенность в том, что это сигнатура метода T.
PM WWW   Вверх
Леопольд
Дата 27.11.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



boostcoder, т.е. это не юзерский, а твой код?
Код
int main() {
   type t;
   sig_t sig;
   connect(t, &type::method, sig);
   
   return 0;
}

Напиши как это должен видеть юзер.

Это сообщение отредактировал(а) Леопольд - 27.11.2010, 15:17


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 27.11.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Леопольд @  27.11.2010,  15:16 Найти цитируемый пост)
это не юзерский, а твой код?

это все мой код.
вопроса не понял.

PM WWW   Вверх
Леопольд
Дата 27.11.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  27.11.2010,  15:13 Найти цитируемый пост)
Леопольд, проблема та же остается. нужно знать имя метода. а мне оно не известно
Если пишется какая-то функциональность, она предоставляет интерфейс. Под "твоим" кодом, я его имел ввиду. "Пользоватлеский" код использует это интерфейс. Ты не можешь знать имён из "пользовательского" код.
Как ты можешь не знать имён в "своём" коде, я не представляю.


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 16:07


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
GoldFinch
Дата 27.11.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>

struct Foo
{
    typedef boost::signals2::signal<void(int)> sig_t;
    sig_t sig;

    typedef void(Foo::*met_t)(int);

    void method(int) {}
};

template<class T, typename T::met_t m>
void connect(T* object)
{
    object->sig.connect(
        boost::bind(m, object, _1)
        );
}

int main()
{
    Foo foo;    
    connect<Foo, &Foo::method>(&foo);
}

это если просто

еще можно получать met_t из sig_t::signature_type, но я забыл как это делается =\

PM MAIL ICQ   Вверх
boostcoder
Дата 27.11.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Леопольд, много слов...
вот суть вопроса:
Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>

typedef boost::signals2::signal<void(int)> sig_t;
struct type {
   void method(int) {}
};

template<typename T>
void connect(T* object, sig_t& sig) {
   sig.connect(
      boost::bind(static_cast<T::sig_t::signature_type>(&T::/* ??? */), object, _1)
   );
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
}

http://liveworkspace.org/code/628b73efe64c...17676ab3d54c8cc

спасибо.

Добавлено через 3 минуты и 25 секунд
GoldFinch, ну вы вывели новый тип, что по сути, то же что имя метода.
Цитата(GoldFinch @  27.11.2010,  16:14 Найти цитируемый пост)
еще можно получать met_t

это что?

Добавлено через 4 минуты и 32 секунды
ааа, понял.

PM WWW   Вверх
Леопольд
Дата 27.11.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  27.11.2010,  16:14 Найти цитируемый пост)
вот суть вопроса:
Если бы я понял вопрос из кода... А код, вроде бы и не изменился. smile


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 16:32


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 27.11.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Леопольд @  27.11.2010,  15:31 Найти цитируемый пост)
Если бы я понял вопрос из кода... А код, вроде бы и не изменился. 


метод можно вызвать по адресу, а можно по имени..  но  нельзя (напрямую) передать имя для вызова..



--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 27.11.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  27.11.2010,  19:14 Найти цитируемый пост)
метод можно вызвать по адресу
Оказалось что не подходит такой вариант.
Код
#include <boost/signals2.hpp>
#include <boost/bind.hpp>
typedef boost::signals2::signal<void(int)> sig_t;
struct type {
   void method(int) {}
};
template<typename T, typename F>
void connect(T& object, F f, sig_t& sig) {
   sig.connect(
      boost::bind(f, object, _1)
   );
}
int main() {
   type t;
   sig_t sig;
   connect(t, &type::method, sig);
   
   return 0;
}
Цитата(boostcoder @  27.11.2010,  15:13 Найти цитируемый пост)
Леопольд, проблема та же остается. нужно знать имя метода. а мне оно не известно. есть только сигнатура, и уверенность в том, что это сигнатура метода T. 
Т.е. ни имени, ни адреса...


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 19:41


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 27.11.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Леопольд @  27.11.2010,  18:41 Найти цитируемый пост)
Оказалось что не подходит такой вариант.

я в курсе.. я для Вас пояснял , что требуется для тс smile



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


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


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

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



вот некоторый ужасТный пример..
http://liveworkspace.org/code/c26e7259dec9...5a1ef3fedddee8b

который напрашивает вопрос, а чего такие опасения насчет лишнего вызова (с деливери)
из за которого Вы лишаете себя, некоторых преимуществ.. и в частности
1. автоматическое приведение параметров
2. возможность использовать параметры по умолчанию в конечной функции
3.. 

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


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 27.11.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  27.11.2010,  19:46 Найти цитируемый пост)
я в курсе.. я для Вас пояснял , что требуется для тс
Всё равно не понял. По адресу нельзя, по имени нельзя. Как тогда? В С++ я других спосоbов не знаю. Всё равно всё сведётся к какому ниbудь имени.
Цитата(mes @  27.11.2010,  20:01 Найти цитируемый пост)
вот некоторый ужасТный пример..
Опять же, в этом примере вызов по адресу, адрес выдаёт функция у который, опять же, есть имя (точнее тут уже два имени, есть ещё имя шаbлона - f1, f2)... В чём тут отличие, кроме очевидного усложнения кода?


Это сообщение отредактировал(а) Леопольд - 27.11.2010, 20:16


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 27.11.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Леопольд @  27.11.2010,  19:01 Найти цитируемый пост)
Всё равно не понял. По адресу нельзя, по имени нельзя. Как тогда?

Код

o.func(); // по имени
o.func_addr()// по адресу 

теперь мы хотим передать для вызова:
Код

void  call (void (A::*)() ) // адрес передать можем, как в обычную функцию.. так и в шаблон..
 ?? // а вот по имени передать нельзя

1. можно написать прокси обертку, которая будет для нужного имени возвращать адрес, 
но этот способом обладает целым рядом недостатков , часть из которых упомянута выше..
2. а можно сделать прокси обертку, которая для по условному (заранее зарезервированному) имени будет вызывать нужный метод..  т.е. получиться отражение имени типа, на имя метода.. 




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


pattern`щик
****


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

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



Цитата(Леопольд @  27.11.2010,  19:41 Найти цитируемый пост)
ни адреса...

нет-нет. извините что ввел в заблуждение. адрес тоже известен.

Добавлено через 6 минут и 43 секунды
Цитата(mes @  27.11.2010,  20:01 Найти цитируемый пост)
вот некоторый ужасТный пример..
http://liveworkspace.org/code/c26e7259dec9...5a1ef3fedddee8b

 smile 

Цитата(mes @  27.11.2010,  20:01 Найти цитируемый пост)
который напрашивает вопрос, а чего такие опасения насчет лишнего вызова (с деливери)

не в этом причина. просто подвернулась ситуация, которую хочется понять. чтоб не напороться еще раз.

Цитата(boostcoder @  27.11.2010,  20:14 Найти цитируемый пост)
адрес тоже известен. 

т..е адрес объекта.


что-то я сегодня торможу по полной...


PM WWW   Вверх
Леопольд
Дата 27.11.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  27.11.2010,  20:14 Найти цитируемый пост)
2. а можно сделать прокси обертку, которая для по условному (заранее зарезервированному) имени 
 Опять же, по имени. Почему просто не сделать функцию в каждом классе с зарезерованным именем, которая bудет возвращать boost::function с нужной сигнатурой?



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 27.11.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(boostcoder @  27.11.2010,  20:14 Найти цитируемый пост)
подвернулась ситуация, которую хочется понять. чтоб не напороться еще раз.

до сих пор никогда не сталкивался с подобной надобностью.

Добавлено через 1 минуту и 17 секунд
Цитата(Леопольд @  27.11.2010,  20:22 Найти цитируемый пост)
с зарезерованным именем

Цитата(Леопольд @  27.11.2010,  20:22 Найти цитируемый пост)
с нужной сигнатурой?

потому что нет правила которое бы описывало возможные комбинации/варианты/сигнатуры и т.д...
PM WWW   Вверх
Леопольд
Дата 27.11.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



boostcoder, это в продолжение вашей неосиливаемой мегаветки про "типозависимые хандлеры"? Вы, видимо, уже какую-то терминологию выраbотали, которой я не знаю...

Это сообщение отредактировал(а) Леопольд - 27.11.2010, 20:28


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 27.11.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



пока получил это:
Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <boost/function_types/parameter_types.hpp>
#include <boost/type_traits.hpp>
#include <typeinfo>
#include <iostream>

typedef boost::signals2::signal<void(int)> sig_t;

struct type {
   void method(int v) {
      std::cout << v << std::endl;
   }
};

template<typename T, typename S>
void connect(T* object, S& sig) {
   typedef typename S::result_type(T::*mp)(typename S::argument_type);
   mp m = ???
//   (object->*m)(3);
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
   sig(3);
}

http://liveworkspace.org/code/c070cebbee78...383fcbd17fb2b15
PM WWW   Вверх
mes
Дата 27.11.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  27.11.2010,  19:14 Найти цитируемый пост)
не в этом причина. просто подвернулась ситуация, которую хочется понять. чтоб не напороться еще раз.

для начала забудем про сигналы.. чтоб облегчить задачу.. 

вот пример в стиле "прокси":
http://liveworkspace.org/code/1b953fdb5fc2...7057ac80a0e28b9
попробуйте переписать его в стиле "с возвращением адреса"
smile



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


pattern`щик
****


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

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



Цитата(Леопольд @  27.11.2010,  20:28 Найти цитируемый пост)
это в продолжение вашей неосиливаемой мегаветки про "типозависимые хандлеры"?

форк smile 
Цитата(Леопольд @  27.11.2010,  20:28 Найти цитируемый пост)
видимо, уже какую-то терминологию выраbотали, которой я не знаю...

"не как у всех" smile

Добавлено через 10 минут и 44 секунды
Цитата(mes @  27.11.2010,  20:35 Найти цитируемый пост)
вот пример в стиле "прокси":
http://liveworkspace.org/code/1b953fdb5fc2...7057ac80a0e28b9
попробуйте переписать его в стиле "с возвращением адреса"

а смысл? тут и так все понятно. или я чего-то не понял?
PM WWW   Вверх
mes
Дата 27.11.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  27.11.2010,  19:38 Найти цитируемый пост)
а смысл? тут и так все понятно. или я чего-то не понял? 

разницу между "проксированием"и "биндингом"...


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


pattern`щик
****


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

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



вот весь вопрос:
Код

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <boost/function_types/parameter_types.hpp>
#include <boost/type_traits.hpp>
#include <typeinfo>
#include <iostream>

typedef boost::signals2::signal<void(int)> sig_t;

struct type {
   void method(int v) {
      std::cout << v << std::endl;
   }
};

template<typename T, typename S>
void connect(T* object, S& sig) {
   typedef typename S::result_type(T::*mp)(typename S::argument_type);
   boost::bind(&T::mp, object, _1)(3); // ошибка :(
}

int main() {
   type t;
   sig_t sig;
   connect(&t, sig);
   sig(3);
}

http://liveworkspace.org/code/b294e00f542d...83e94c6403a17bc

Добавлено через 1 минуту и 45 секунд
Цитата(mes @  27.11.2010,  20:58 Найти цитируемый пост)
разницу между "проксированием"и "биндингом"... 

тут Вы правы smile 

но разве то, чего я хочу добиться, все же невозможно? просто любопытно smile
PM WWW   Вверх
mes
Дата 27.11.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  27.11.2010,  20:00 Найти цитируемый пост)
вот весь вопрос:

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



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


pattern`щик
****


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

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



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

да-да-да!
это последнее чего не понимаю...
уже и сигнатуру вывел(косо правда) smile

Добавлено через 8 минут и 46 секунд
мысли вслух:
почему при указании типа в static_cast<void(T::*)(int)> можно не указывать имя. а получить адрес имея сигнатуру нельзя?! что-то не так...
PM WWW   Вверх
mes
Дата 27.11.2010, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  27.11.2010,  20:16 Найти цитируемый пост)
 а получить адрес имея сигнатуру нельзя?! что-то не так... 

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

это, на мой взгляд, еще один из недостатков С++, то что нельзя одно и то же имя применить (без ухищрений)  к разным типам .. 



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


pattern`щик
****


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

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



в общем, я так понял, это невозможно..

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


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


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

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



кстати насчет сигнатур..вас никогда не смущала такое 
Код

struct A {
 static void sf() {}
};
int main ()
{
   A a; a.sf ();
   A::sf();
}

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

Добавлено @ 21:54
Цитата(boostcoder @  27.11.2010,  20:48 Найти цитируемый пост)
в общем, я так понял, это невозможно..

это все равно что по определению (прилагательному) найти субъект  нему относящийся..
вот имеем красный.. а что красный: мяч, фрукт, знак ... ?

хоть  грубоватое сравнение, но надеюсь поможет.. 


Это сообщение отредактировал(а) mes - 27.11.2010, 22:16


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


pattern`щик
****


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

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



Цитата(mes @  27.11.2010,  21:51 Найти цитируемый пост)
какая сигнатура у sf ?

и правда, какая?
ее то и методом назвать сложно. но вызывается как метод тоже...

Цитата(mes @  27.11.2010,  21:51 Найти цитируемый пост)
это все равно что по определению (прилагательному) найти субъект  нему относящийся..
вот имеем красный.. а что красный мяч, фрукт, знак ... ?

ну да.

Добавлено через 14 секунд
Цитата(mes @  27.11.2010,  21:51 Найти цитируемый пост)
надеюсь поможет..  

помогло.

Добавлено через 6 минут и 19 секунд
хотя..с другой стороны...я тут подумал...допустим, к примеру, то, чего я хочу - возможно.
теперь, представим ситуацию, когда есть два метода с одинаковой сигнатурой и разными именами. что тогда? какой метод выбрать компилятору? как решить?
ответ - никак smile
посему такое невозможно. если бы изначально меня посетила эта(очевидная) мысль, не было бы потрачено столько времени своего и участников.

всем спасибо.

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


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


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

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



Цитата(boostcoder @  27.11.2010,  21:16 Найти цитируемый пост)

и правда, какая?
ее то и методом назвать сложно. но вызывается как метод тоже..

ну прежде всего  понятия "метод" нет в С++ и оно введено из другой области.. 
в С++ есть статические и нестатические функции-члены. 

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

вот в частности поэтому "адрес + сигнатура" не одно  и то же (по функциональности) , что и "имя функции"..


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


pattern`щик
****


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

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



Цитата(mes @  27.11.2010,  22:37 Найти цитируемый пост)
ну прежде всего  понятия "метод" нет в С++ и оно введено из другой области.. 

корни появления этого термина в с++(а сначала в Си в поделках Страуструпа) я помню, из курса общей истории smile 

Цитата(mes @  27.11.2010,  22:37 Найти цитируемый пост)
от в частности поэтому "адрес + сигнатура" не одно  и то же (по функциональности) , что и "имя функции".. 

все верно.


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


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


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

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



Цитата(boostcoder @  27.11.2010,  21:39 Найти цитируемый пост)
корни появления этого термина в с++(а сначала в Си в поделках Страуструпа)

 неа это чужие корни, от которых Страуструп убежал smile



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


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

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