2013-04-27 3 views
3

Недавно я написал класс, основанный на политике, используя Объект случайных чисел C++ 11. Мне бы хотелось иметь возможность передать случайное распределение stdlib в качестве политики для моего класса (в частности, в качестве параметра шаблона шаблона). Для этого я мог бы, конечно, создать свою собственную оболочку класса RandomPolicy. Но я подозревал, что что-то не так с тем, что я делаю.Почему случайное распределение не принимает двигатель в качестве параметра шаблона?

Таким образом, возник вопрос: почему случайное распределение не принимает тип двигателя в качестве параметра шаблона? Вместо этого я обнаружил, что движок принимает дистрибутив как аргумент для оператора() (а не как параметр шаблона). В коде, можно было бы написать:

std::default_random_engine engine; 
std::uniform_int_distribution<int> distribution(0, 9); 
int n = distribution(engine); 

В коде, что я хотел бы, чтобы иметь возможность написать:

Конечно, распределение затем также должны принять семя, как аргумент (его конструктору). Несомненно, я забыл о некоторых проблемах/ограничениях здесь. Так что я задаюсь вопросом, каковы были конкретные причины, чтобы не сделать его параметром шаблона.

Я подозревал, что это может быть связано с тем, что дистрибутивы не должны обрабатывать конструкции двигателей, но для меня это не показалось мне очень вероятным, поскольку конструктор двигателя не принимает никаких аргументов, кроме семя (которое будет передано в распределение).

ответ

3

я могу думать о двух причин:

  1. Вы намекали на что: двигатель может потребоваться произвольные аргументы в конструктор, а распределение не будет знать, как строить. Тот факт, что большинство (всех?) Стандартных двигателей берут только семя, не означает, что не может быть такого, который принимает дополнительные параметры. Вы даже можете создать собственный движок с произвольными параметрами конструктора.
  2. Один единственный объект двигателя может использоваться со многими различными распределениями. На самом деле я бы сказал, что это предпочтительный способ использовать его: построить только один движок и столько распределений, сколько необходимо. Альтернативой создания нескольких двигателей и их семени может быть несколько хлопотно.

На самом деле это форма зависимость впрыска.

+0

Ах, спасибо. Я не знал, что вы свободны, чтобы заставить двигатели принимать больше, чем просто параметр семени. Ответ принят :). – Aleph

+0

Определено, что вам нужно, чтобы положить в класс для его использования со стандартными дистрибутивами? Я знаю, что он вызывает 'operator()' для получения значения, но есть ли что-то, что нужно использовать (или оно даже указано в стандарте?) – Xymostech

+0

@Xymostech: Да, они называются _Уникальные требования к генератору случайных чисел_ , В основном это: 1) typedef 'result_type' (беззнаковое целое число); 2) 'result_type operator()'; 3) 'result_type min()'; 4) 'result_type max()'. Дополнительно: 'min()' и 'max()' являются константами, 'min() rodrigo

Смежные вопросы