Добрый день!
Работаю с 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 и их нужно задать явно.
Помогите пожалуйста это сделать.
Здравствуйте, 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) );
Здравствуйте, 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&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
Спасибо, товарищи!
У меня получилось так:
for_each(points_in.begin(), points_in.end(),
boost::bind( static_cast<void (Writer::*)(const Point&)>(&Writer::write) , &writer, _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);
Здравствуйте, 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));
}