私は私の例のDrawNumber
関数public
を作っています。上限を取るオーバーロードを提供し、次に newuniform_int_distribution::param_type
を渡すことができますuniform_int_distribution::operator()
はparam_type
、対応する分布と同じ引数を使用して構築できます。
N3337 から、§26.5.1.6/9 [rand.req.dist]
D
分布のパラメーターに対応する引数を取るコンストラクターのそれぞれについてP
、同じ要件に従い、数、型、およびデフォルト値が同じ引数をとる対応するコンストラクターを持たなければなりません。さらに、D
分布のパラメーターに対応する戻り値のメンバー関数のそれぞれについてP
、同じ名前、型、およびセマンティクスを持つ対応するメンバー関数を持たなければなりません。
ここD
で、 は乱数分布関数オブジェクトの型で、は関連付けP
られた によって命名された型ですD
param_type
#include <iostream>
#include <random>
typedef unsigned int uint32;
class Random {
public:
Random() = default;
Random(std::mt19937::result_type seed) : eng(seed) {}
uint32 DrawNumber();
uint32 DrawNumber(uint32 ub);
private:
std::mt19937 eng{std::random_device{}()};
std::uniform_int_distribution<uint32> uniform_dist{0, UINT32_MAX};
};
uint32 Random::DrawNumber()
{
return uniform_dist(eng);
}
uint32 Random::DrawNumber(uint32 ub)
{
return uniform_dist(eng, decltype(uniform_dist)::param_type(0, ub));
}
int main()
{
Random r;
std::cout << r.DrawNumber() << std::endl;
std::cout << r.DrawNumber(42) << std::endl;
}