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是因为一些谷歌搜索向我展示了rvalues 曾经是有问题的。但这并没有解决任何问题。

它类似于这个错误,但它太老了,我不认为它是相关的。

gcc 的输出并不是特别有启发性:

在 bindnew.cpp:1:0 包含的文件中:/usr/include/c++/4.7/functional:在 '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: 来自 '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}; 类型名 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:注意:候选者是:/usr/include/c++/4.7/functional:1211:2:注意:模板_Result std::_Bind<_Functor(_Bound_args ...)>::operator( )(_Args&& ...) [with _Args = {_Args ...}; _结果 = _结果;_Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1211:2: 注意:_结果 = _结果;_Functor = int (*)(int, int); _Bound_args = {int, std::_Placeholder<2>}] /usr/include/c++/4.7/functional:1211:2: 注意:_结果 = _结果;_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:错误:无法在参数传递/usr/include/c++/4.7/functional 中将“std::_No_tuple_element”转换为“int”: 1225:2:注意:模板 _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _结果 = _结果;_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:错误:无法在参数传递/usr/include/c++/4.7/functional 中将“std::_No_tuple_element”转换为“int”: 1239:2:注意:模板 _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) volatile [with _Args = {_Args ...}; _结果 = _结果;_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:错误:无法在参数传递/usr/include/c++/4.7/functional 中将“std::_No_tuple_element”转换为“int”: 1253:2:注意:模板 _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const volatile [with _Args = {_Args ...}; _结果 = _结果;_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

6

占位符位置对象(例如,当您使用时_2)不是您调用的函数中参数的位置,而是创建的可调用对象中参数的占位符。相反,总是从_1增加开始。

所以:

auto bar_auto=std::bind(foo,1,_1);

等等


std::bind这意味着您可以通过简单地执行类似的操作来切换创建的对象中的参数

auto bar_auto=std::bind(foo,_2,_1);

当您“调用”bar_auto对象时,第一个参数将是 的第二foo个参数,调用中的第二个参数将是 的第一个参数foo

于 2013-08-29T08:41:30.413 回答
4

_2占位符意味着使用返回的仿函数的第二个参数。因此类型

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 回答