c++ - std::bind() 不绑定(bind)参数

我正在尝试创建一个方法队列,这些方法使用 std::bind() 绑定(bind)到对象。当调用 std::bind() 时绑定(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){}

主要.cpp

#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

最佳答案

如果您有一个带有两个参数的函数,并且绑定(bind)了两个参数,还剩下多少个?不是一个,零个。所以你的 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();
}

https://stackoverflow.com/questions/68693967/

相关文章:

javascript - 如何使用 Axios 拦截器向响应添加一些 header ?

python - 如何用 Pandas 构建矢量化函数?

c# - 如何在控制台应用程序 .NET Core (C#) 中制作打开文件对话框?

c - 通过在未初始化的数据段 (bss) 中打印 "garbage values",我们可以映射出

reactjs - 如何在 onSubmit 事件中使用 react-query useQuery?

r - 基于一个列模态和其他列的新列

css - 注入(inject)具有特定范围的 Chakra UI 全局样式

python - 根据python中另一个字符串元素的数量删除字符串元素

string - 将两个不同列上第 n 次出现的 'foo' 和 'bar' 替换为相应列中所提供文

string - 函数不想使用函数参数返回字符串切片