2

で使っ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 path/include/ -std=c++11 -L path/lib/ -l blitz

4

1 に答える 1

7

resizeオーバーロードされた関数である可能性があります(C++ 11ではそうでなければなりません)ので、必要なオーバーロードをコンパイラに伝える必要があります。1 つの引数形式の場合、これは 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);

オーバーロードされた関数ではない場合(C++03 モードの GCC のように)、2 つの引数 (1 つにはデフォルト値があります) を取り、bindデフォルトの引数を使用できないため、2 番目の引数を指定する必要があります。

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);
于 2013-03-08T12:09:59.257 に答える