3

最近,我正在编写一个使用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();

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

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

4

1 回答 1

3

我可以想到两个原因:

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

它实际上是依赖注入的一种形式。

于 2013-04-27T20:17:58.693 回答