как связать vector.resize

Я пытаюсь использовать boost::bind с std::vector<>::resize,

Но следующий код не скомпилируется:

#include <boost/bind.hpp>
#include <vector>
using namespace boost;

int main(){
typedef std::vector<double> type;
type a;
bind(&type::resize, _1, 2)(a);
return 0;
}

Итак, как я могу это сделать?

Спасибо!

буст версия 1.53
GCC версии 4.8 или 4.6

*Редактировать: * Приведенный выше код работает с -std = c ++ 11. На самом деле, моя первоначальная проблема заключается в следующем:

#include <boost/bind.hpp>
#include <blitz/array.h>
#include <vector>
using namespace boost;
using namespace blitz;

int main(){
typedef Array<double, 1> type;
type a;
//a.resize(4) is ok;
bind(&type::resize, _1, 2)(a);
return 0;
}

Моя команда компиляции:
g ++ t.cpp -I путь / include / -std = c ++ 11 -L путь / lib / -l блиц

2

Решение

resize может быть перегруженной функцией (в C ++ 11 она должна быть), поэтому вам нужно указать компилятору, какую перегрузку вы хотите. Для формы с одним аргументом это должно работать в C ++ 11:

bind(static_cast<void (type::*)(type::size_type)>(&type::resize), _1, 2)(a);

Или более наглядно:

typedef void (type::*resize_signature)(type::size_type);
bind(static_cast<resize_signature>(&type::resize), _1, 2)(a);

Если это не перегруженная функция (как с GCC в режиме C ++ 03), тогда она принимает два аргумента (один имеет значение по умолчанию), и вам нужно предоставить второй аргумент, потому что bind нельзя использовать аргументы по умолчанию:

typedef void (type::*resize_signature)(type::size_type, const value_type&);
bind(static_cast<resize_signature>(&type::resize), _1, 2, 0.0)(a);

К сожалению, эта версия C ++ 03 не переносима, реализации могут использовать одну функцию или пару перегрузок. Чтобы сделать его портативным, или для работы с другими типами, такими как Array Вы можете обернуть вызов в пользовательский функтор, который вызывает resizeтак что вам не нужно знать точную подпись:

typename<class VecT>
struct resizer<VecT> {
void operator()(VecT& v, unsigned n) const { v.resize(n); }
};
// ...
bind(resizer<type>(), _1, 2)(a);

Или в C ++ 11 просто используйте лямбда-выражение вместо bind:

auto resize = [](type& v) { v.resize(2); };
resize(a);
7

Другие решения

Других решений пока нет …