Модераторы: 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   Вверх
Страницы: (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.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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