为什么随机分布不将引擎作为模板参数?

时间:2013-04-27 20:02:48

标签: c++ templates random c++11

最近,我正在编写一个基于策略的课程,使用 C ++ 11的随机数设施。我本来希望能够将stdlib随机分布作为策略传递给我的类(特别是作为模板模板参数)。为了实现这一点,我当然可以创建自己的RandomPolicy类包装器。但我怀疑我做的事情有些不对劲。

也就是说,它提出了以下问题:为什么随机分布不将引擎类型作为模板参数?相反,我发现引擎将分布作为operator()的参数(而不是模板参数)。 在代码中,您可以写:

std::default_random_engine engine;
std::uniform_int_distribution<int> distribution(0, 9);
int n = distribution(engine);

在代码中,我希望能够写出来:

// std::default_random_engine would be the default template argument though
std::uniform_int_distribution<int, std::default_random_engine> distribution(0, 9);
int n = distribution();

当然,分发也必须将种子作为参数(对于它的构造函数)。 当然,我在这里忘记了一些问题/限制。 所以我想知道具体的原因是什么不使它成为模板参数。

我怀疑这可能是因为发行版不应该处理引擎的构造,但毕竟这对我来说听起来不太可能,因为引擎的构造函数除了种子之外不会接受任何参数(将传递给分发)。

1 个答案:

答案 0 :(得分:3)

我可以想到两个原因:

  1. 您暗示:引擎可能需要构造函数的任意参数,并且分发将不知道如何构建它。大多数(所有?)标准引擎只接受种子的事实并不意味着不能有一个接受额外参数的引擎。您甚至可以使用任意构造函数参数构建自己的引擎。
  2. 单个引擎对象可以与许多不同的分布一起使用。实际上我会说这是使用它的首选方式:根据需要构建一个引擎和多个发行版。必须建造几个引擎并将它们全部播种的替代方案可能有点麻烦。
  3. 它实际上是依赖注入的一种形式。