std ::函数和std ::绑定返回值

std::function and std::bind return value

本文关键字:std 返回值 绑定 函数      更新时间:2023-10-16

我正在尝试了解std :: bind and std ::函数的工作方式。我无法获得以下代码进行编译:

#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)在有效的现代C 项目34中建议用lambda替换std::bind的使用,例如

auto fun = [](float b, std::string const& s){ function(10, b, s); };
// Identical invocation:
fun(0.2, "world");