我上了这个课:
class EMX_Counter {
private:
std::vector<std::unique_ptr<WireBase>> WiresList;
public:
EMX_Counter(const std::vector<std::unique_ptr<WireBase>>& w) : WiresList(w) {}
EMX_Counter(std::vector<std::unique_ptr<WireBase>>&& w) : WiresList(std::move(w)) {}
std::future<std::vector<double>> getEmxEfficiency();
};
WireBase
是一个抽象类(在这里它的工作方式并不重要),我需要一个唯一的ptr,因为我需要多态性。也就是说,getEmxEfficiency()
需要花费一些时间,因为向量包含至少28'000 / 30'000项,并且对该方法的一个调用很慢。
我决定使用并行方法来加快速度,这就是结果:
std::future<std::vector<double>> EMX_Counter::getEmxEfficiency() {
return std::async([*this]() {
std::vector<double> temp;
std::for_each(std::execution::par, WiresList.begin(), WiresList.end(), [&](auto& PolyObject) {
double result = PolyObject->getPartialEfficiency();
//more time-expensive operations
temp.push_back( result );
});
return temp;
});
}
调用PolyObject->getPartialEfficiency();
返回一个double且不引发异常,这是“安全的”。
我正在使用最新的Visual Studio版本(昨天更新)和标志/std:c++17
。问题是我收到此错误:
std::unique_ptr<WireBase,std::default_delete<_Ty>>::unique_ptr(const
std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to
reference a deleted function (file: xmemory0).
[*this]
,所以我有该对象的副本,并且我确定(是吗?)异步执行不会有问题。我应该改为通过参考值捕获吗?在for_each
lambda中,我已经被引用捕获了,因为temp在范围内,并且销毁它不会有问题。
答案 0 :(得分:1)
我应该改用以下代码:
Any::toString
将fun <T> doSomething(value: T, action: (t: T) -> String = Any::toString as (T) -> String) {
// ...
}
声明为SELECT SalesValue, Department, Period
FROM (
SELECT SalesValue, Department, Period
FROM <table>) up
PIVOT (SUM(Sales) FOR SalesValue IN (Department, Period)) AS pvt
ORDER BY Period
的地方。现在该变量已受保护,并且由于共享指针,我不再有编译时问题!