Я пытаюсь использовать 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 блиц
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);
Других решений пока нет …