【发布时间】:2018-10-24 17:45:53
【问题描述】:
在 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);
我忽略了任何更优雅的解决方案吗?
编辑:也许我应该更准确。假设目标是将策略保存在一个变量中,该变量可以具有三个策略中的任何一个。该变量应该是函数的参数。
【问题讨论】:
-
这完全取决于选择的来源。例如,如果不将
policy变量限制为int,您可以直接将ExecutionPolicy传递给f2。但大概你有一些限制,我们不知道那是什么。 -
但问题是,据我了解,这三个策略没有共同的基类。这正是让这件事变得如此棘手的原因
-
哦,对了。嗯,嗯。最好的解决方案仍然取决于“选择”的来源。您可能可以使用 constexpr 向量或其他东西将整数映射到类型。虽然这仍然不能完全帮助你。不确定;祝你好运!