我有以下代码使用可变参数模板调用std :: async,
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10000)
y = np.sin(np.pi * x * 0.001)
plt.plot(x, y)
plt.ylabel(u"\u03B1")
plt.xlabel('β')
plt.savefig(r'<insert your path here>/sinewave.pdf')
plt.show()
但是我收到以下编译错误消息:
没有用于调用'async(std :: launch,bool(TestChild :: &)(int,int,bool&,std :: vector&),TestParent ,int&,int&, bool&,TestChild *&,std :: vector *&)' startInx,endInx,nothingToCheck,args ...));
我认为这可能与以下事实有关:我将附加参数与参数包一起传递。 任何人都知道这有什么问题,我应该怎么做才能使它起作用?
答案 0 :(得分:3)
这是代码中的两个主要问题:
(1)std::async
在将所有传递的参数转发给提供的函数之前先衰减所有传递的参数,这意味着checkRules
中的references参数不同于在以下情况下尝试使用的类型async
调用该功能,您需要进行以下更改:
template< typename Fn, typename ...Args >
bool checkBlock( std::reference_wrapper<bool> const& toCheck,
Fn&& fn, Args&& ... args )
{
int startIndx = 0;
int endIndx = 10;
std::future< bool > tk(std::async(std::launch::async,
std::forward<Fn>(fn),
startIndx, endIndx,
toCheck,
std::forward<Args>(args) ... ) );
return tk.get();
}
(2)您将this
作为参数传递给checkBlock
,最终将最终作为checkRules
的参数(通过异步调用),但是成员函数不接受TestChild*
以匹配this
。由于您使用的是指向async
成员函数的指针,因此需要使用std::bind
来绑定this
参数,并对要更改的参数使用std::wrap
: / p>
#include <functional>
using namespace std::placeholders;
bool TestChild::check()
{
bool toCheck;
std::vector< bool > results;
return checkBlock( std::ref(toCheck), std::bind(&TestChild::checkRules, this, _1, _2, _3, _4), std::ref(results));
}
答案 1 :(得分:1)
return checkBlock( toCheck, &testChild::checkRules, this, &results);
您正在将this
与Args
传递给您,而TestChild*&
的参数与函数不匹配,因此还有一个额外的return checkBlock( toCheck, &testChild::checkRules, ~~this~~, &results);
不属于您。
Args
只需删除~~ this ~~
此外,您还应该这样std :: forward toCheck, std::forward<Args>(args) ... ) );
:
winner = ("Name: "+name1+" Score: "+tot1)
win_score.write(winner)