1

std::bindコードのさまざまな場所で使用するのに多くの問題があります。うまくいくこともあれば、うまくいかないこともあるので、根本的に間違ったことをしていると思います。

私が理解している限り、次の基本的な使用法はstd::bindうまくいくはずです:

#include <functional>

int foo(int a, int b){ return a+b; }

int main(){

    using namespace std::placeholders;

    // works
    auto bar_auto=std::bind(foo,1,_2);

    // compile error
    std::function<int(int)> bar_fun=std::bind(foo,1,_2);

    int quux=1;
    // compile error
    std::function<int(int)> bar_fun_lvalue=std::bind(foo,quux,_2);

}

確かに の型bar_autostd::function<int(int)>( foo1 つのint引数がバインドされた型の) であるのに、なぜbar_funコンパイルに失敗するのでしょうか? 私が含めbar_fun_lvalueたのは、いくつかのグーグルで右辺値が以前は問題があることがわかったからです。しかし、これは何も修正しませんでした。

これはこのバグに似ていますが、それは古すぎて関連性があるとは思えません。

gcc の出力は特に啓発的ではありません。

bindnew.cpp:1:0 からインクルードされたファイル: /usr/include/c++/4.7/functional: In instanceiation of 'static _Res std::_Function_handler<_Res(_ArgTypes ...), _Functor>::_M_invoke(const std ::_Any_data&, _ArgTypes ...) [with _Res = int; _Functor = std::_Bind))(int, int)>; _ArgTypes = {int}]': /usr/include/c++/4.7/functional:2298:6: required from 'std::function<_Res(_ArgTypes ...)>::function(_Functor, typename std::enable_if <(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type) [with _Functor = std::_Bind))(int, int )>; _Res = int; _ArgTypes = {int}; typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type = std::function::_Useless]' bindnew.cpp:15:52: ここから必要 /usr/include/c++/4.7/functional:1912:40: エラー: '(std::_Bind))(int, int)>) (int)' /usr/include/c++ への呼び出しに一致しません/4.7/functional:1140:11: note: 候補は: /usr/include/c++/4.7/functional:1211:2: note: template _Result std::_Bind<_Functor(_Bound_args ...)>::operator( )(_Args&& ...) [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1211:2: 注意: _Result = _Result; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1211:2: 注意: _Result = _Result; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1211:2: 注意:
テンプレート引数の推論/置換に失敗しました: /usr/include/c++/4.7/functional:1206:35: エラー: 'std::_No_tuple_element' を 'int' に変換できません (/usr/include/c++/4.7/functional: 1225:2: 注意: テンプレート _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1225:2: 注意:
テンプレート引数の推論/置換に失敗しました: /usr/include/c++/4.7/functional:1219:35: エラー: 'std::_No_tuple_element' を 'int' に変換できません (/usr/include/c++/4.7/functional: 1239:2: 注意: テンプレート _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1239:2: 注意:
テンプレート引数の推論/置換に失敗しました: /usr/include/c++/4.7/functional:1233:35: エラー: 'std::_No_tuple_element' を 'int' に変換できません (/usr/include/c++/4.7/functional: 1253:2: 注意: テンプレート _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1253:2: 注: テンプレート引数の推定/置換に失敗しました: /usr/include/c++/4.7/functional:1247 :35: エラー: 引数の受け渡しで 'std::_No_tuple_element' を 'int' に変換できません

4

2 に答える 2

4

プレースホルダーは、返された functor_22 番目の引数を使用することを意味します。したがって、

std::bind(foo,1,_2)

ではありませんstd::function<int(int)>

std::function<int(unspecified_type, int)>

を取得するにはstd::function<int(int)>、使用します

std::bind(foo, 1, _1)
//                ^^
于 2013-08-29T08:39:53.567 に答える