boost::bind и перегруженные функции
От: silart  
Дата: 27.07.11 05:05
Оценка:
Добрый день!
Работаю с boost::bind уже давно, но раньше с таким не сталкивался.

Допустим есть некий класс Writer, он имеет пока одну функцию write:

void write(const Point& point);


В клиенте этого класса есть такой код:

vector<Point> points_in;
...
    Writer writer(buffer, caption, frequency, size);
    points_in = helpers::make_randomPoints(size, count);

     for_each(points_in.begin(), points_in.end(), 
         boost::bind(&Writer::write, &writer, _1) );


Этот код прекрасно собирается и работает.
Но вот возникла необходимость добавить в класс Writer еще одну функцию write:

        void write(const Point& point);
        void write(const std::vector<Point>& points);


И вышеприведенный код перестает собираться, компилятор выдает кучу ошибок.
Пробовал в новую версию функции write добавить еще параметр, это помогает.

Очевидно, что компилятор не может правильно определить параметры шаблонной функции bind и их нужно задать явно.
Помогите пожалуйста это сделать.
Re: boost::bind и перегруженные функции
От: jerry_ru  
Дата: 27.07.11 05:41
Оценка:
Здравствуйте, silart, Вы писали:

S>
S>vector<Point> points_in;
S>...
S>    Writer writer(buffer, caption, frequency, size);
S>    points_in = helpers::make_randomPoints(size, count);

S>     for_each(points_in.begin(), points_in.end(), 
S>         boost::bind(&Writer::write, &writer, _1) );
S>


S>Этот код прекрасно собирается и работает.

S>Но вот возникла необходимость добавить в класс Writer еще одну функцию write:

S>
S>        void write(const Point& point);
S>        void write(const std::vector<Point>& points);
S>


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

S>Пробовал в новую версию функции write добавить еще параметр, это помогает.

S>Очевидно, что компилятор не может правильно определить параметры шаблонной функции bind и их нужно задать явно.

S>Помогите пожалуйста это сделать.

я обычно делаю примерно так:

//объявляем тип указателя:
typedef void (Writer::* write_ptr)(const Point&);

//явно приводим типы
boost::bind( (write_ptr)(&Writer::writ), &writer, _1) );


за корректность я сейчас ре ручаюсь, но в результате работает. Если тип функции не длинный можно прям по месту приводить:
//явно приводим типы
boost::bind( (void (Writer::*)(const Point&)(&Writer::writ), &writer, _1) );
Re: boost::bind и перегруженные функции
От: abrarov Россия http://asio-samples.blogspot.com/
Дата: 27.07.11 05:42
Оценка:
Здравствуйте, silart, Вы писали:

S>Добрый день!

S>Работаю с boost::bind уже давно, но раньше с таким не сталкивался.

S>Допустим есть некий класс Writer, он имеет пока одну функцию write:


S>
S>void write(const Point& point);
S>


S>В клиенте этого класса есть такой код:


S>
S>vector<Point> points_in;
S>...
S>    Writer writer(buffer, caption, frequency, size);
S>    points_in = helpers::make_randomPoints(size, count);

S>     for_each(points_in.begin(), points_in.end(), 
S>         boost::bind(&Writer::write, &writer, _1) );
S>


S>Этот код прекрасно собирается и работает.

S>Но вот возникла необходимость добавить в класс Writer еще одну функцию write:

S>
S>        void write(const Point& point);
S>        void write(const std::vector<Point>& points);
S>


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

S>Пробовал в новую версию функции write добавить еще параметр, это помогает.

S>Очевидно, что компилятор не может правильно определить параметры шаблонной функции bind и их нужно задать явно.

S>Помогите пожалуйста это сделать.

http://www.google.com/search?hl=ru&amp;q=boost%3A%3Abind+overloaded

http://www.gamedev.net/topic/371209-boostbind-on-overloaded-methods/
http://lists.boost.org/Archives/boost/2003/05/47454.php

Google — лучший друг программиста!
Programs must be written for people to read, and only incidentally for machines to execute
Re[2]: boost::bind и перегруженные функции
От: silart  
Дата: 27.07.11 06:23
Оценка: +2
Спасибо, товарищи!

У меня получилось так:

     for_each(points_in.begin(), points_in.end(), 
        boost::bind( static_cast<void (Writer::*)(const Point&)>(&Writer::write) , &writer, _1)
        );


Собирается, ошибок не выдает, но выглядит мягко говоря не айс!
Re[3]: boost::bind и перегруженные функции
От: _nn_ www.nemerleweb.com
Дата: 27.07.11 07:21
Оценка: +1
Здравствуйте, silart, Вы писали:

S>Спасибо, товарищи!


S>У меня получилось так:


S>
S>     for_each(points_in.begin(), points_in.end(), 
S>        boost::bind( static_cast<void (Writer::*)(const Point&)>(&Writer::write) , &writer, _1)
S>        );
S>


S>Собирается, ошибок не выдает, но выглядит мягко говоря не айс!


А Boost.Foreach кто запрещает использовать ?
BOOST_FOREACH(Point const& p, points_in)
  writer.write(p);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: boost::bind и перегруженные функции
От: Warturtle  
Дата: 27.07.11 09:23
Оценка: 2 (1)
Здравствуйте, silart, Вы писали:

S>Спасибо, товарищи!


S>У меня получилось так:


S>
S>     for_each(points_in.begin(), points_in.end(), 
S>        boost::bind( static_cast<void (Writer::*)(const Point&)>(&Writer::write) , &writer, _1)
S>        );
S>


S>Собирается, ошибок не выдает, но выглядит мягко говоря не айс!

Можно еще явно указать параметры щаблона:

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <boost/bind.hpp>

struct A
{
    void write(int) { printf("A:write(int)\n"); }
    void write(char *) { printf("A:write(char *)\n"); }
};

int main()
{
    using namespace std;
    using namespace boost;
    A a;
    vector< int > v;
    v.push_back(1);
    //for_each(v.begin(), v.end(), bind(&A::write, &a, _1));
    for_each(v.begin(), v.end(), bind< void, A, int >(&A::write, &a, _1));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.