我正在尝试创建一个用随机数填充列表的函数,并根据列表项的类型生成整数或浮点数。到目前为止,我已经想出了以下代码,并且它有效:
template <typename T>
void generateRandom(list<T>& numberList){
default_random_engine randomGenerator(random_device{}());
if( typeid(T) == typeid(int) ){
uniform_int_distribution<T> distribution(1000, 2000);
auto myGenerator = bind(distribution, randomGenerator);
generate(numberList.begin(), numberList.end(), myGenerator);
}
else if( typeid(T) == typeid(double) ){
uniform_real_distribution<T> distribution(1000.0, 2000.0);
auto myGenerator = bind(distribution, randomGenerator);
generate(numberList.begin(), numberList.end(), myGenerator);
}
else{
return;
}
}
但是,我对这个解决方案并不是很满意。只是感觉应该有某种方法可以从 IF 语句中分解除实际分布之外的所有内容。就像是:
template <typename T>
void generateRandom(list<T>& numberList){
default_random_engine randomGenerator(random_device{}());
X distribution;
if( typeid(T) == typeid(int) )
distribution = uniform_int_distribution<T>(1000, 2000);
else if( typeid(T) == typeid(double) )
distribution = uniform_real_distribution<T>(1000.0, 2000.0);
else
return;
auto myGenerator = bind(distribution, randomGenerator);
generate(numberList.begin(), numberList.end(), myGenerator);
}
(X 是此处缺少的内容的占位符)
但是由于uniform_int_distribution
and uniform_real_distribution
没有共同的基类,那怎么可能呢?我尝试过使用函数指针和函子,但我似乎从未超越 IF 语句,这很烦人。可以用更优雅的方式解决这个问题吗?
注意:这是学校作业的一部分,我们必须使用generate()
和<random>
生成随机数的函数和模板。我认为我原来的解决方案是可以接受的,我只是不喜欢 IF 语句中那些重复的代码行的外观...:)