c++ - 运行时不同的执行策略
问题描述
在 C++17 中,algorithm
标头中的许多函数现在可以采用执行策略。例如,我可以定义和调用这样的函数:
template <class ExecutionPolicy>
void f1(const std::vector<std::string>& vec, const std::string& elem, ExecutionPolicy&& policy) {
const auto it = std::find(
std::forward<ExecutionPolicy>(policy),
vec.cbegin(), vec.cend(), elem
);
}
std::vector<std::string> vec;
f1(vec, "test", std::execution::seq);
但是我还没有找到在运行时使用不同策略的好方法。例如,当我想根据某些输入文件使用不同的策略时。
我玩弄了各种变体,但最终问题始终是不同类型的std::execution::seq
,std::execution::par
和std::execution::par_unseq
.
一个可行但繁琐的解决方案如下所示:
void f2(const std::vector<std::string>& vec, const std::string& elem, const int policy) {
const auto it = [&]() {
if (policy == 0) {
return std::find(
std::execution::seq,
vec.cbegin(), vec.cend(), elem
);
}
else if (policy == 1) {
return std::find(
std::execution::par,
vec.cbegin(), vec.cend(), elem
);
}
else{
return std::find(
std::execution::par_unseq,
vec.cbegin(), vec.cend(), elem
);
}
};
}
f2(vec, "test", 0);
有没有我忽略的更优雅的解决方案?
编辑:也许我应该更准确。假设目标是将策略保存在一个变量中,该变量可以具有三个策略中的任何一个。该变量应该是函数的参数。
解决方案
这里的标准方法是将类型的选择与类型的使用分开:后者采用由前一个非模板函数(或具有较少模板参数的函数模板)实例化多次的函数模板的形式。
为避免在这两层之间重复正常参数,请使用通用 lambda 作为模板。为避免重复选择逻辑,请创建一个函数模板,使用适当的策略调用任何 lambda:
enum Policy {seq,par,par_unseq};
template<class F>
auto maybe_parallel(F f,Policy p) {
switch(p) {
case seq: return f(std::execution::seq);
case par: return f(std::execution::par);
default: return f(std::execution::par_unseq);
}
}
auto f2(const std::vector<std::string>& vec,
const std::string& elem,Policy p) {
return maybe_parallel
([&](auto &pol) {return std::find(pol,vec.begin(),vec.end(),elem);},p);
}
推荐阅读
- node.js - 寻找node-sqlite3的优化方法
- java - XML Parsing Query Linq 用于搜索所需
- asp.net - asp.net mvc 如何获取到我的网站的传入帖子请求的 Web 服务器 ip
- c++ - 修改 not_null 以禁止与 nullptr 进行比较
- javascript - 使用自动完成 jquery 和 Odoo rpc 调用的输入不显示建议
- angularjs - How to use track by in ng-repeat having array in ng-model
- java - 如何将位图图像添加到int数组
- android - singleLine true for Textview,But multiple lines comes in one line..,Need to show 1st line
- c# - Passing parameter to asmx web-service in Postman
- python-3.x - Keras One 热编码内存管理 - 最好的可能出路