所以我想编写一个测量随机数生成的运行时间的函数。为了能够使用不同的随机引擎和发行版,我使用模板,但我还需要一个模板参数来初始化我写入数字的向量。
template<typename T_rng, typename T_dist, typename T_vectype>
double timer_gen(T_rng& rng, T_dist& dist, int n){
std::vector< T_vectype > vec(n, 0);
auto t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < n; ++i)
vec[i] = dist(rng);
auto t2 = std::chrono::high_resolution_clock::now();
auto runtime = std::chrono::duration_cast<std::chrono::microseconds>(t2-t1).count()/1000.0;
return runtime;
}
int main(){
const int n = 1000;
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::minstd_rand rng_minstd (seed);
std::uniform_real_distribution<double> dist_double(0.0, 1.0);
double runtime_double_minstd = timer_gen<std::minstd_rand, std::uniform_real_distribution<double>, double>(rng_minstd, dist_double, n);
}
这个有效!但我觉得最后一行必须有更好的方法。前两个模板参数可以隐式推导出来,我只需要列出它们,因为第三个需要设置为int。有更好的方法吗?
答案 0 :(得分:1)
是,更改参数的顺序:
template<typename T_vectype, typename T_rng, typename T_dist>
double timer_gen(T_rng& rng, T_dist& dist, int n){
// .. as before
}
int main(){
const int n = 1000;
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::minstd_rand rng_minstd (seed);
std::uniform_real_distribution<double> dist_double(0.0, 1.0);
double runtime_double_minstd = timer_gen<double>(rng_minstd, dist_double, n);
}
如果指定的模板参数少于模板参数,则编译器将(尝试)推导出其余参数。这也涵盖了“没有明确指明参数”的情况。
答案 1 :(得分:1)
一个选项是重新排列模板参数的顺序,以便首先指定向量的value_type
。另一个选项是将T_vectype
设置为typename T_dist::result_type
的默认模板参数,这是暴露的typedef别名为您为随机数生成器指定的类型。