Variadic模板的C ++错误

时间:2018-11-05 21:26:13

标签: c++ variadic-templates stdasync

我有以下代码使用可变参数模板调用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 ...));

我认为这可能与以下事实有关:我将附加参数与参数包一起传递。 任何人都知道这有什么问题,我应该怎么做才能使它起作用?

2 个答案:

答案 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);

您正在将thisArgs传递给您,而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)