绑定返回值和可变值模板
bind return value and variadic templates
我试图在c++中创建一个线程池。这个概念是main将创建一个新的Task, ThreadPool类将获得Task对象并实现其他工作。这是Task类:
template<typename ... Arguments>
class Task{
//
public:
Task(std::function<void (Arguments...)> _func, Arguments... _args){
auto f1 = std::bind(_func, _args...);
f1();
};
void run(){
};
};
,我是这样使用它的:
#include <iostream>
#include <algorithm>
#include "Task.hpp"
void prtinhi(int a)
{
std::cout << a << std::endl;
return;
}
int main(){
Task<int> task(prtinhi, 5);
task.run();
return 0;
}
显然,Task对象将在ThreadPool中传递,ThreadPool将根据某些逻辑调用run()。此代码运行成功打印5。但是我想要的是从run()函数调用f1()。如果我改变任务类有auto f1
定义作为类成员,我得到一个错误:
non-static data member declared ‘auto’
如果我声明它是静态的,就不能给它赋值。怎么解这个呢?有更好的方法吗?
为什么任务需要知道函数的参数?该任务应该是一个void()
类型擦除的可调用对象。
using Task = std::function<void()>;
Task task([]{ prtinhi(5); });
ThreadPool pool;
pool.schedule(task);
// ...
// `prtinhi(5)` will be eventually called.
如果您需要获得返回值,则需要std::future
。
ThreadPool
可按以下方式实现:
struct ThreadPool
{
some_lockfree_queue<Task> _queue;
std::vector<std::thread> _workers;
void initialize()
{
for(int i = 0; i < num_threads; ++i)
{
_workers.emplace_back([this]
{
Task t = _queue.try_dequeue();
t();
});
}
}
};
std::bind
是坏(观看STL的演讲了解更多信息)。您应该使用lambdas来绑定所需的参数并返回一个虚函数。
相关文章:
- 将右值绑定到左值引用
- C++映射中搜索元组错误:无法将"int"左值绑定到"int&&"
- 如何将所选行的第一列值绑定到变量并在 QT 的 SQL 命令中使用它?
- 如何有效地将左值或右值绑定到同一引用
- 允许将右值绑定到非常量左值引用
- 错误:无法将"std::<char>basic_ostream"左值绑定到"std::basic_ostream<char>&&"
- 将左值绑定到右值引用--g++错误
- 将r值绑定到l值引用是非标准的Microsoft C++扩展
- 了解值绑定
- 通过将返回值绑定到const引用,C++性能得到改善
- 为什么不能将"const char*"的左值绑定到"const char* const&&?
- 将临时右值绑定到 std::vector 构造函数中的引用左值
- 启动 std::thread 时无法将(函数指针)左值绑定到(函数指针)右值
- 重载运算符<<:无法将左值绑定到"std::basic_ostream<char>&&"
- 提升 Python:使用 return_internal_reference 将参数的生存期与返回值绑定
- 理解警告:将r值绑定到l值引用
- 为什么常量左值与给定 T&& 和常量 T& 重载的常量右值绑定不同?
- 正在将常量右值绑定到右值引用
- C++中的右值绑定混淆
- 将左值绑定到右值引用,移动变量和函数返回