Do they all inherit from a base class? Do I have to use templates?
(I am referring to these http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15319/)
I am doing this right now:
typedef std::mt19937 RNG;
and then
class Chooser {
public:
Chooser(RNG& rng, uint n, uint min_choices, uint max_choices):
In other words, I’m passing references to RNG. How would I pass in an arbitrary generator?
Also, I realize this is maybe a different question, but how do I pass the generator to STL?
std::random_shuffle(choices_.begin(), choices_.end(), rng);
doesn’t seem to work.
solution to passing generator:
typedef std::ranlux64_base_01 RNG;
typedef std::mt19937 RNGInt;
solution to passing to STL:
struct STL_RNG {
STL_RNG(RNGInt& rng): gen(rng) {}
RNGInt& gen;
int operator()(int n) { return std::uniform_int<int>(0, n)(gen); }
};
They don’t all inherit from a base (which is a little surprising), but it doesn’t matter because that’s not how C++ functors work.
For arbitrary RNGs of a single given type, you got it right as (now) posted.
If you mean, how do I define a function which accepts any random number generator as an argument.
You don’t need to use any more templates than this, because of type deduction.
Defining one function to accept different RNG’s is trickier because semantically that requires having a common base type. You need to define a base type.