Как исправить ошибку «статическое утверждение не удалось: аргумент шаблона не является целочисленным типом»? - PullRequest
0 голосов
/ 11 января 2019

Я хочу сгенерировать любое число от 0 до максимального значения данного типа (T). Нет проблем с генерацией чисел для int, short, long и т. Д., Но я не могу сделать это для float и double. Я получаю эту ошибку: «статическое утверждение не выполнено: аргумент шаблона не является целочисленным типом».

Мой код:

#include <iostream>
#include <limits>
#include <random>

template<class T>
T questGenerator()
{
    std::random_device rd;
    std::default_random_engine generator(rd());
    std::uniform_int_distribution<T> distribution(0, std::numeric_limits<T>::max());

    return distribution(generator);
}

int main()
{
    std::cout << questGenerator<float>();
}

Это пример ввода и вывода, который мне был дан:

input:

std::cout << generateQuest<short>() << std::endl;
std::cout << generateQuest<short>() << std::endl;
std::cout << (short)generateQuest<char>() << std::endl;
std::cout << (short)generateQuest<char>() << std::endl;
std::cout << generateQuest<float>() << std::endl;
std::cout << generateQuest<float>() << std::endl;

Выход:

10105
5332
52
110
3.39889e+38
2.7026e+38

1 Ответ

0 голосов
/ 11 января 2019

Это неопределенное поведение для использования std::uniform_int_distribution<T> для любого T, отличного от: short, int, long, long long, unsigned short, unsigned int, unsigned long или unsigned long long.

Возможно, вы захотите рассмотреть std::uniform_real_distribution<T>.

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

...