Недавно я написал класс, основанный на политике, используя Объект случайных чисел C++ 11. Мне бы хотелось иметь возможность передать случайное распределение stdlib в качестве политики для моего класса (в частности, в качестве параметра шаблона шаблона). Для этого я мог бы, конечно, создать свою собственную оболочку класса RandomPolicy
. Но я подозревал, что что-то не так с тем, что я делаю.Почему случайное распределение не принимает двигатель в качестве параметра шаблона?
Таким образом, возник вопрос: почему случайное распределение не принимает тип двигателя в качестве параметра шаблона? Вместо этого я обнаружил, что движок принимает дистрибутив как аргумент для оператора() (а не как параметр шаблона). В коде, можно было бы написать:
std::default_random_engine engine;
std::uniform_int_distribution<int> distribution(0, 9);
int n = distribution(engine);
В коде, что я хотел бы, чтобы иметь возможность написать:
Конечно, распределение затем также должны принять семя, как аргумент (его конструктору). Несомненно, я забыл о некоторых проблемах/ограничениях здесь. Так что я задаюсь вопросом, каковы были конкретные причины, чтобы не сделать его параметром шаблона.
Я подозревал, что это может быть связано с тем, что дистрибутивы не должны обрабатывать конструкции двигателей, но для меня это не показалось мне очень вероятным, поскольку конструктор двигателя не принимает никаких аргументов, кроме семя (которое будет передано в распределение).
Ах, спасибо. Я не знал, что вы свободны, чтобы заставить двигатели принимать больше, чем просто параметр семени. Ответ принят :). – Aleph
Определено, что вам нужно, чтобы положить в класс для его использования со стандартными дистрибутивами? Я знаю, что он вызывает 'operator()' для получения значения, но есть ли что-то, что нужно использовать (или оно даже указано в стандарте?) – Xymostech
@Xymostech: Да, они называются _Уникальные требования к генератору случайных чисел_ , В основном это: 1) typedef 'result_type' (беззнаковое целое число); 2) 'result_type operator()'; 3) 'result_type min()'; 4) 'result_type max()'. Дополнительно: 'min()' и 'max()' являются константами, 'min()
rodrigo