Итак, если драйвер MySQL Native Driver (mysqlnd) недоступен, и поэтому с помощью bind_result и fetch вместо get_result код становится:
include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$stmt->bind_result($EmailVerified, $Blocked);
while ($stmt->fetch())
{
/* Use $EmailVerified and $Blocked */
}
$stmt->close();
$conn->mysqli->close();
Мы можем объединить обе перегрузки GetRand
как шаблон функции.
Прежде всего, обратите внимание, что эффект std::uniform_real_distribution<T>
не определен, если T
не является одним из float
, double
и long double
. Например, 29.6.1.1 Общие требования [rand.req.genl] в проекте стандарта C ++ n4687 гласит:
В этом подпункте 29,6 эффект создания шаблона:
...
d) который имеет параметр типа шаблона с именем RealType не определен, если только соответствующий аргумент шаблона не является cv-unqualified и не является одним из float , double , или длинный двойной .
blockquote>Кроме того, 29,6 .8.2.2 Шаблон классаiform_real_distribution [rand.dist.uni.real] описывает
std::uniform_real_distribution
с параметром типа шаблона ]RealType
и, следовательно,std::uniform_real_distribution<int>
не определено:blockquote>template<class RealType = double> class uniform_real_distribution { ... };
Также аналогичное ограничение существует для
std::uniform_int_distribution<T>
[ 1122]. Таким образом, нам нужно переключить тип распределения междуstd::uniform_real_distribution<T>
иstd::uniform_int_distribution<T>
в зависимости отT
.
Мы можем проверить вышеуказанные ограничения, используя
std::is_floating_point
иstd::is_integral
и сделать следующее переключение:#include <random> #include <type_traits> template<class T> using uniform_distribution = typename std::conditional< std::is_floating_point<T>::value, std::uniform_real_distribution<T>, typename std::conditional< std::is_integral<T>::value, std::uniform_int_distribution<T>, void >::type >::type;
Тогда две перегрузки
GetRand
могут быть объединены в следующий шаблон функции , Здесь я также избегаю рекурсивного построенияstd::mt19937_64
и делаю функцию поточно-ориентированной, применяя принятый ответ в этого поста .template <class T> T GetRand(T lower, T upper) { static thread_local std::random_device rd; static thread_local std::mt19937_64 mt(rd()); uniform_distribution<T> dist(lower,upper); return dist(mt); }
Наконец, сторона вызывающего абонента будет выглядеть следующим образом:
auto i = GetRand<int> (0, 1); // 0 or 1 auto f = GetRand<float> (0, 1); // [0, 1) auto d = GetRand<double>(0, 1); // [0, 1)