我有一些家庭作业,我很难理解(可能)如何将参数传递给std::线程构造函数。
假设以下代码(我删除了不需要的部分)
template<typename T, typename Task>
class Scheduler
{
private:
typedef std::unordered_map<std::size_t, T> Results;
class Solver
{
public:
Solver(Task&& task) : m_thread(&Solver::thread_function, std::move(task))
{
m_thread.detach();
}
Solver(Solver&& solver) = default; // required for vector::emplace_back
~Solver() = default;
private:
void thread_function(Task&& task)
{
task();
}
std::thread m_thread;
};
public:
Scheduler() = default;
~Scheduler() = default;
void add_task(Task&& task)
{
m_solvers.emplace_back(std::move(task));
}
private:
std::vector<Solver> m_solvers;
};
template<typename T>
struct Ftor
{
explicit Ftor(const T& t) : data(t) { }
T operator()() { std::cout << "Computed" << std::endl; return data; }
T data;
};
int main()
{
Scheduler<int, Ftor<int>> scheduler_ftor;
Scheduler<int, std::function<int(void)>> scheduler_lambda;
Ftor<int> s(5);
scheduler_ftor.add_task(std::move(s));
scheduler_lambda.add_task([](){ std::cout << "Computed" << std::endl; return 1; });
}
为什么不编译?MVS2015在抱怨
函数式(1195):错误C2064:术语不计算为采用1个参数的函数函数式(1195):注意:类没有定义“运算符()”或用户定义的转换运算符到指针到函数或引用到函数,它需要适当数量的参数
注意:在编译类模板成员函数时'Scheduler
而G 4.9.2
功能:在'结构std::实例化_Bind_simple
函数:1665:61:错误:在'类std::中没有名为'type'的类型result_of
我想,将std::移动到std::thread可能存在一些问题。
我不懂你的代码,但要解决这个问题,一个外推的答案是(大多数代码都是psuedocode)让我们假设有一个函数int test(int name)
。
thread t0;
t0 = thread(test,32);
thread t1(test,43);
将参数传递给函数。
int temp = 0;
int testfunc(int& q)
{
cout<<q;
}
thread t1;
t1 = thread(testfunc,ref(temp));
简而言之,您只需传递必须在线程中运行的函数的名称作为第一个参数,函数参数按照与函数定义中相同的顺序跟随它,为了通过引用传递,您可以使用包装器。请参见下面的示例。
#include <iostream>
#include <thread>
#include <string>
using namespace std;
void test(int a,int &a,string test)
{
\\do something
}
int main()
{
int test1 = 0;
string tt = "hello";
thread t1;
t1 = thread(23,&test1,tt);
t1.detach();
return 0;
}
如果你想知道join()
和detach()
的使用,请参考这个线程:我什么时候应该使用std::thread::detach?,参考我在那个线程中的回答帖子。
问题 你希望函数的某些参数强制使用关键字参数传递 解决方案 将强制关键字参数放到某个*参数或者单个*后面就能达到这种效果。比如: def recv(maxsize, *, block): 'Receives a message' pass recv(1024, True) # TypeError recv(1024, block=True) # Ok 利用这种技术,我们还能在接受
问题 你想构造一个可接受任意数量参数的函数。 解决方案 为了能让一个函数接受任意数量的位置参数,可以使用一个*参数。例如: def avg(first, *rest): return (first + sum(rest)) / (1 + len(rest)) # Sample use avg(1, 2) # 1.5 avg(1, 2, 3, 4) # 2.5 在这个例子中,rest是由所
问题内容: 我一直在想是否可以在PHP中将函数作为参数传递;我想要类似的东西,当您在JS中编程时: 我想要的是在exampleMethod中的某处执行该功能。这在PHP中可行吗? 问题答案: 如果您使用的是PHP 5.3.0或更高版本,则是可能的。 请参见手册中的匿名函数。 对于您的情况,您将这样定义:
问题内容: 我想了解为什么下面的代码片段无法编译。将函数接受为可能具有任何返回类型的函数参数的Go方法是什么? 播放:https://play.golang.org/p/CqbuEZGy12 我的解决方案基于Volker的答案: 播放:https://play.golang.org/p/waOGBZZwN7 问题答案: 你绊倒了围棋新人一个非常普遍的误解:空接口并 不能 意味着“任何类型”。确实不
我对编程和C++相当陌生。我有一个函数,我想接受以模板化值作为参数的函数指针。我的意思是... 我有这个功能: 我试过的: 结果: .h:165:22:注意:已忽略候选模板:无法将“function ,allocator >&)”与“void(*)(bool,std::vectorstd::vectorstd::allocatorstd::tuple &)”void postgrescaller:
问题内容: 我想创建一个存储过程,该存储过程接受IN参数中的所有值作为单个字符串。 这是我尝试过的一个示例,但是没有用。 我收到以下错误: 运行此查询时: 问题答案: 您需要将VARCHAR大小更改为最大值(或较低的有效值)。 但是,请注意,如果使用多字节字符集,则限制会更低: