最近、 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();
もちろん、ディストリビューションはシードを (そのコンストラクターへの) 引数として受け取る必要があります。確かに、ここでいくつかの問題/制限を忘れています。では、テンプレートパラメータにしなかった具体的な理由は何だったのだろうか。
ディストリビューションがエンジンの構築を処理する必要がないためではないかと思いましたが、エンジンのコンストラクターはシード (ディストリビューションに渡されます)。