C ++ - Шаблонное равномерное распределение?

Итак, если драйвер 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();
1
задан Alex Wicks 21 March 2019 в 04:08
поделиться

1 ответ

Мы можем объединить обе перегрузки 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 , или длинный двойной .

Кроме того, 29,6 .8.2.2 Шаблон классаiform_real_distribution [rand.dist.uni.real] описывает std::uniform_real_distribution с параметром типа шаблона ] RealType и, следовательно, std::uniform_real_distribution<int> не определено:

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);
}

Наконец, сторона вызывающего абонента будет выглядеть следующим образом:

DEMO

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)
0
ответ дан Hiroki 21 March 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: