在<random>
中定义了几种不同类型的随机数生成器,如minstd_rand0
或mt19937
,但即使它们具有完全相同的成员函数,它们也不共享(例如operator()
或min
和max
)。因此,要使用具有uniform_int_distribution
分布的这种生成器,分布的函数也必须是模板。如果我想将一个生成器存储在另一个类中,我将不得不使用生成器作为模板参数使该类成为模板类,如下所示:
template <typename generator_t>
class foo
{
generator_t gen;
}
一种概括使用这些生成器的方法是将它们抽象为类型为std::function<int()>
的函数对象,然后编写一个方法,该方法返回这样一个函数对象生成器,给出来自<random>
的普通生成器像这样(可选择包括分发):
template <typename generator_t>
std::function<int()> create_generator(generator_t& gen)
return [gen](){
return gen();
};
}
类似地,还可以创建一个抽象普通生成器中可用的所有其他函数的类。在这两种情况下,由于这些间接性,它会不必要地降低性能。
由于我生成了大量的随机数,因此我需要使该过程尽可能高效,同时还能让我交换出生成器或发行版而无需重写任何代码。我不喜欢将所有使用随机数生成模板类的类与生成器类型作为模板参数的选项,因为<random>
中定义的生成器没有公共基础。有没有其他方法可以实现这个目标?