c++ - std::function 和 std::bind 返回值

标签 c++ std-function stdbind

我试图了解 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);
                                                            ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请问有人能解释一下吗?以及如何修复此错误?

最佳答案

你快到了,只需将 fun 的类型更改为

std::function<void(float, std::string const&)> fun = std::bind(...);
//                ^^ no more int here

fun(0.2, "world");
//  ^^^^^^^^^^^^ those types must match the above signature

请注意,当将 int 类型的第一个函数参数固定为值 10 时,您更改了函数签名。因此,它不能是 std::function 实例化的类型。

进一步注意,Scott Meyers 在 Effective Modern C++ 的第 34 项中建议用 lambda 替换 std::bind 用法,例如

auto fun = [](float b, std::string const& s){ function(10, b, s); };

// Identical invocation:
fun(0.2, "world");

关于c++ - std::function 和 std::bind 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55124517/

相关文章:

C++ std::function 从派生类绑定(bind)

c++ - 将只移动结构绑定(bind)到函数

绑定(bind)函数中的 C++ socketio 段错误

c++ - 如何从函数(c++ UWP 应用程序)修改按钮内容?

c++ - 如何将 boost.lambda 与 boost.thread 结合使用来获取线程的返回值?

c++ - 使用 'new' 时,通过引用返回指针或通过指针本身返回指针有什么区别?

c++ - std::function 的 typename 关键字

c++ - 为什么 std::function 构造函数或赋值之间存在差异?

c++ - 带有可变参数的 std::function 列表如何工作

c++ - 自定义类型的正则表达式