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

その理由として、次の 2 つが考えられます。

  1. あなたはそれをほのめかしました:エンジンはそのコンストラクターに任意の引数を必要とする可能性があり、ディストリビューションはそれを構築する方法を知りません. 標準エンジンのほとんど (すべて?) がシードのみを取るという事実は、追加のパラメーターを取るエンジンが存在しないという意味ではありません。任意のコンストラクタ パラメータを使用して独自のエンジンを構築することもできます。
  2. 1 つのエンジン オブジェクトをさまざまなディストリビューションで使用できます。実際には、これが推奨される使用方法であると言えます。エンジンを 1 つだけビルドし、必要な数のディストリビューションをビルドします。複数のエンジンを構築し、それらすべてをシードしなければならないという代替案は、やや面倒かもしれません。

これは、実際には依存性注入の一種です。

于 2013-04-27T20:17:58.693 に答える