В библиотеке С++ 11 std есть несколько генераторов случайных чисел (RNG), каждый из которых реализует концепцию UniformRandomNumberGenerator. Затем они могут использоваться как аргумент для случайных распределений, см. Также эту документацию для обзора.
Преимущество этой конструкции заключается в том, что выбор базового двигателя RNG отменяется из-за его применения. Однако для разработки также требуется определение (а не только объявления) всех вызовов для RNG (если тип RNG должен оставаться неопределенным как параметр шаблона). Таким образом, в
struct complicated_random_distribution
{
/*
some data and auxiliary methods here
*/
// complicated; may call RNG::operator() many times
template<typename RNG>
some_type operator()(RNG&gen) const;
};
элемент operator()
не может быть просто реализован в отдельном модуле компиляции (CU), но должен быть доступен в том же файле заголовка (или один #include
d из него).
Для отдельной реализации желательно, чтобы какой-то способ был пакет RNG таким же образом, как std::function<>
упаковывает любой вызываемый объект.
(Просто используя std::function
и предоставляя значения для RNG::min()
и RNG::max()
в качестве аргументов функции, определенной в отдельном CU, является ограничительным и не позволит использовать, скажем, std::uniform_real_distribution<>
внутри).
Как это можно сделать? Имеются ли реализации для этого? Будет ли библиотека std предоставлять это в будущем? Или я после красной селедки?
Редактировать Генераторы случайных чисел должны иметь static
членов min()
и max()
, что делает стирание типа жестким или невозможным (GNU libstdС++ не делает этого предположения и стирания типа с нестатическими членами min()
и max()
работает, но не с LLVM libС++, в котором используются стандартные члены static
). Есть ли способ решить эту проблему? Если нет, не означает ли это, что стандарт С++ имеет искаженный интерфейс для генераторов случайных чисел?