std ::函数和std ::绑定返回值
std::function and std::bind return value
我正在尝试了解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");
相关文章:
- 如何从 std::thread 返回值
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- 使用std::optional时的命名返回值优化
- C++ std::map 的返回值引用
- 检查 std::string.c_str() 的返回值
- pop_back() 在 std::list 中返回值?
- 使用std::tie解包返回值会导致额外的成本吗?
- 无法将 std::绑定返回值分配给 std::function
- 从函数的返回值将元素C++存储到 std::vector 中时出现意外结果
- std::move 返回值 weak_ptr::锁定弄乱了shared_ptr的引用计数?
- 如何将C std ::未来返回值调整到C#System.Threading.tasks.task
- 静态断言 std::array 的大小,其类型是使用 decltype 从成员函数的返回值中获取的
- std ::函数和std ::绑定返回值
- 返回值std ::不匹配的相等向量
- 无法将 std::lower_bound 返回值分配给 vector::iterater
- std::clamp - 检测函数返回值是否绑定到 const T&
- 没有从类型为"basic_istream<char,std::__1::char_traits >"的返回值<char>到函数返回的可行转换
- 如何从std :: function推断返回值类型
- 自定义类对象的向量的std::find的返回值