Как определить концепцию C++ для вызываемого объекта, который принимает любой PRNG в качестве аргумента?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как определить концепцию C++ для вызываемого объекта, который принимает любой PRNG в качестве аргумента?

Сообщение Anonymous »

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

Код: Выделить всё

class RegularDie {
int _min, _max;
public:
constexpr RegularDie(int max, int min = 1): _max(max), _min(min) {
if(_max < _min) {
std::swap(_max, _min);
}
}

constexpr int min() const {return _min;}
constexpr int max() const {return _max;}
constexpr double oddsOf(int val) const {
if(val > _max || val < _min) {
return 0;
}
return 1. / (_max - _min + 1);
}

//This is the part I want the concept to test for
template
requires std::uniform_random_bit_generator
constexpr int operator()(PRNG && rng) const {
std::uniform_int_distribution dist{_min, _max};
return dist(rng);
}
};

int main() {
std::mt19937 engine{std::random_device{}()};
RegularDie cube{6};
std::print("First roll: {}\n", cube(engine));
std::minstd_rand engine2{std::random_device{}()};
std::print("Second roll: {}\n", cube(engine2));
}
Моя проблема в том, что я не знаю, как выразить концепцию, которая действительно позволит это проверить. Лучшее, что у меня есть, это что-то вроде этого, но для моих целей оно не работает:

Код: Выделить всё

template
concept Rollable = requires(Type t, PRNG prng) {
std::uniform_random_bit_generator;
{ t(prng) } -> std::convertible_to;
};
Причина, по которой это не работает, заключается в том, что мне требуется явно передавать тип PRNG, который я собираюсь использовать, а я не хочу, чтобы эта концепция применяла эту концепцию:

Код: Выделить всё

//Compiles, but doesn't prove the point, because the class might not accept other PRNGs
static_assert(Rollable);
Именно поэтому эта пересмотренная концепция не работает и для меня.

Код: Выделить всё

template
concept Rollable = requires(Type t, std::mt19937 prng, std::minstd_rand prng2) {
std::uniform_random_bit_generator;
{ t(prng) } -> std::convertible_to;
{ t(prng2) } -> std::convertible_to;
};

//Compiles, but same problem. I've only tested two possible PRNGs for validity.
static_assert(Rollable);
Итак, два вопроса:
  • Можно ли вообще написать концепцию, которая будет ограничивать так, как я хочу?
  • Если это возможно, как бы я это сделал?


Подробнее здесь: https://stackoverflow.com/questions/793 ... -its-argum
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»