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 и перегруженные функции
От: 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));
}
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
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.