C ++ обязательный вопрос - PullRequest
1 голос
/ 04 августа 2010

Есть ли способ заставить boost::bind работать с std::fill?

Я попробовал следующее, но это не сработало:

boost::bind(std::fill, x.begin(), x.end(), 1);

1 Ответ

10 голосов
/ 04 августа 2010

Проблема в том, что std::fill является функцией шаблона. Шаблонные функции на самом деле не существуют, так сказать, до момента их создания. Вы не можете взять адрес std::fill, потому что он на самом деле не существует; это просто шаблон для похожих функций, которые используют разные типы. Если вы предоставите параметры шаблона, он будет ссылаться на конкретную реализацию шаблона, и все будет хорошо.

Функция std::fill имеет два параметра шаблона: ForwardIteratorType , который является типом итератора для контейнера, и DataType , который является типом, который содержит контейнер. Вы должны предоставить оба варианта, чтобы компилятор знал, какой экземпляр шаблона std::fill вы хотите использовать.

std::vector<int> x(10);
boost::bind(std::fill<std::vector<int>::iterator, int>, x.begin(), x.end(), 1);
...