c++ - std::bind() 不绑定参数
问题描述
我正在尝试创建一个使用 std::bind() 绑定到对象的方法队列。调用 std::bind() 时绑定方法的参数(另一个类的对象)。由于某种原因,我无法让它工作。
解析器.h
#ifndef PARSER_H
#define PARSER_H
class File_Descriptor;
class Parser{
public:
void parse(File_Descriptor *file_descr);
};
#endif
解析器.cpp
#include <iostream>
#include "parser.h"
#include "file_descriptor.h"
using namespace std;
void Parser::parse(File_Descriptor *file_descr){
cout << file_descr->id << endl;
}
文件描述符.h
#ifndef FILE_DESCRIPTOR_H
#define FILE_DESCRIPTOR_H
#include "parser.h"
class File_Descriptor{
public:
File_Descriptor(const int &id);
Parser parser;
int id;
};
#endif
文件描述符.cpp
#include "file_descriptor.h"
File_Descriptor::File_Descriptor(const int &id):id(id){}
主文件
#include <functional>
#include <queue>
#include "file_descriptor.h"
#include "parser.h"
using namespace std;
int main(){
File_Descriptor file_descr(123);
function<void(File_Descriptor*)> task = bind(&Parser::parse, &file_descr.parser, &file_descr);
//task(); file_descr(123) is not bound to &Parser::parse(File_Descriptor *file_descr)
queue<function<void(File_Descriptor*)>> task_queue;
task_queue.push(task);
function<void(File_Descriptor*)> exec_task = task_queue.pop();
exec_task();
return 0;
}
错误信息
main.cpp: In function ‘int main()’:
main.cpp:17:64: error: conversion from ‘void’ to non-scalar type
‘std::function<void(File_Descriptor*)>’ requested
17 | function<void(File_Descriptor*)> exec_task = task_queue.pop();
| ~~~~~~~~~~~~~~^~
main.cpp:18:15: error: no match for call to ‘(std::function<void(File_Descriptor*)>) ()’
18 | exec_task();
| ^
In file included from /usr/include/c++/9/functional:59,
from main.cpp:1:
/usr/include/c++/9/bits/std_function.h:683:5: note: candidate: ‘_Res std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res = void; _ArgTypes = {File_Descriptor*}]’
683 | function<_Res(_ArgTypes...)>::
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/9/bits/std_function.h:683:5: note: candidate expects 1 argument, 0 provided
解决方案
如果你有一个有两个参数的函数,并且你绑定了两个参数,还剩下多少个?不是一,零。所以你std::function
的 s 是错误的,应该是std::function<void()>
。没有任何问题std::bind
。也std::queue<T>::pop
返回void
,而不是弹出的元素。你必须使用front
,然后pop
。
int main() {
File_Descriptor file_descr(123);
std::function<void()> task = std::bind(&Parser::parse, &file_descr.parser, &file_descr);
task();
std::queue<std::function<void()>> task_queue;
task_queue.push(task);
std::function<void()> exec_task = std::move(task_queue.front());
task_queue.pop();
exec_task();
}
推荐阅读
- python - 如何解决 KeyError(f"None of [{key}] are in the [{axis_name}]") 在这种情况下(Pandas)?
- html - 如何更改选取框文本的大小?
- algorithm - 算法:通过m个不同节点的最短路径
- google-cloud-platform - 在 google/GKE 中创建 http 负载均衡器时出现 502 服务器错误
- ssl - puppetdb:“验证错误:num=20:无法获取本地颁发者证书”和“SSL_connect SYSCALL 返回=5 errno=0 state=SSLv3/TLS 写入完成”
- laravel - 使用 Laravel swiftmailer 发送电子邮件(无法建立连接)
- java - 处理动态响应
- python - Python中的CSV,不保存重复数据
- ios - NSURLSession 的最佳实践是什么?
- c - 用 C 计算 Pi