【发布时间】:2019-03-12 14:56:47
【问题描述】:
我试图了解 std::bind 和 std::function 是如何工作的。 我无法编译以下代码:
#include <iostream>
#include <string>
#include <functional>
void function(int a, float b, std::string const &s)
{
std::cout << "printing function" << std::endl;
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << s << std::endl;
}
int main(int argc, char *argv[])
{
std::bind(&function, 10, 11.1, "hello")();
std::function<void(int, float, std::string const&)> fun = std::bind(&function, 10, std::placeholders::_1, std::placeholders::_2);
fun(0.2, "world");
return 0;
}
编译器抱怨:
main.cpp: In function 'int main(int, char**)':
main.cpp:16:69: error: conversion from 'std::_Bind_helper<false, void (*)(int, float, const std::__cxx11::basic_string<char>&), int, const std::_Placeholder<1>&, const std::_Placeholder<2>&>::type {aka std::_Bind<void (*(int, std::_Placeholder<1>, std::_Placeholder<2>))(int, float, const std::__cxx11::basic_string<char>&)>}' to non-scalar type 'std::function<void(int, float, const std::__cxx11::basic_string<char>&)>' requested
std::function<void(int, float, std::string const&)> fun = std::bind(&function, 10, std::placeholders::_1, std::placeholders::_2);
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请问,有人可以解释一下吗?以及如何解决此错误?
【问题讨论】:
-
将
a绑定到10后,剩下的只是void(float, std::string const&)。 -
另请注意,
std::bind在 C++17 中已被弃用,而使用 lambda 更为可取。auto fun = [](float a, std::string const& b) { function(10, a, b); }; -
值得指出的是,在现代代码中,lambdas 现在总是比 std::bind 更可取。
-
@Zereges
std::bind绝不会被弃用。std::bind1st等已弃用,但std::bind仍有一些用途:sdowney.org/2017/06/why-stdbind-cant-be-formally-deprecated -
@AlanBirtles 你说得对,我不知道为什么我认为它已被弃用
标签: c++ std-function stdbind