在 C++17 中,algorithm header 中的许多函数现在可以采用执行策略。例如,我可以定义和调用这样的函数:
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);
}
关于c++ - 运行时不同的执行策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975114/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试