Первая проблема заключается в том, что std::vector::push_back
перегруженной функция в C++ 0x (возникает перегрузка с опорным параметром именующим и перегрузкой с опорным параметром RValue).
Вторая проблема заключается в том, что типы функций-членов стандартной библиотеки не определены: разработчикам разрешено добавлять дополнительные параметры с аргументами по умолчанию для функций-членов, и им разрешено добавлять дополнительные перегрузки функций-членов, поэтому любое кастинг, который вы do не будет переносимым. В примере с неоднозначностью предполагается, что мы игнорируем эту вторую проблему.
Необходимо ввести функцию указатель-член к правильному типу, иначе это не будет работать с реализацией библиотеки C++ 0x (функция-указатель-член будет неоднозначной). Вам понадобятся:
(void (std::vector<int>::*)(const int&))&std::vector<int>::push_back
Использование C++ 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(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(); });
W шляпу, вы пытаетесь сделать со строками в векторе? – stefanB
bind и lambda оба имеют заполнители '_1', связываются в анонимном пространстве имен, лямбда в пространстве имен лямбда. попробуйте не использовать целое boost :: lambda namespace – Anycorn