Первая проблема заключается в том, что std::vector::push_back
является перегруженной функцией в C++0x (существует перегрузка со ссылочным параметром lvalue и перегрузка с ссылочным параметром rvalue).
Вторая проблема заключается в том, что типы функций-членов стандартной библиотеки не определены: разработчикам разрешено добавлять дополнительные параметры с аргументами по умолчанию в функции-члены, и им разрешено добавлять дополнительные перегрузки функций-членов, поэтому любое приведение, которое вы делаете, не будет портативный. Пример устранения неоднозначности предполагает, что мы игнорируем эту вторую проблему.
Вам нужно будет привести функцию-указатель к правильному типу, иначе это не будет работать с реализацией библиотеки C++0x (функция-указатель на-член будет неоднозначной). Вам понадобиться:
(void (std::vector<int>::*)(const int&))&std::vector<int>::push_back
Используя функциональную библиотеку С++ 0x, работает следующее (это должно работать и с Boost, если вы замените std::
на boost::
; я просто не могу это проверить):
std::for_each(
strings.begin(),
strings.end(),
std::bind(
(void (std::vector<int>::*)(const int&))&std::vector<int>::push_back,
std::ref(sizes),
std::bind(&std::string::size, std::placeholders::_1)));
Обратите внимание, что это настоящий беспорядок, и гораздо понятнее просто использовать цикл for:
for(std::vector<int>::const_iterator i(strings.begin()); i != strings.end(); ++i)
{
sizes.push_back(i->size());
}
Или, если у вас есть компилятор, поддерживающий лямбда-выражения:
std::for_each(strings.begin(), strings.end(),
[&](const std::string& s) { sizes.push_back(s.size()); });
Или, для большего удовольствия:
std::transform(strings.begin(), strings.end(), std::back_inserter(sizes),
[](const std::string& s) { return s.size(); });
person
James McNellis
schedule
29.10.2010
_1
, bind в анонимном пространстве имен, lambda в пространстве имен lambda. попробуйте не использовать все пространство имен boost:: lambda - person Anycorn   schedule 29.10.2010