Итак, я хочу написать функцию, которая измеряет время выполнения генерации случайных чисел. Чтобы иметь возможность использовать разные случайные движки и распределения, я использую для них шаблоны, но мне также нужен параметр шаблона для инициализации вектора, в который я записываю числа.

    template<typename T_rng, typename T_dist, typename T_vectype>
    double timer_gen(T_rng& rng, T_dist& dist, int n){
        std::vector< T_vectype > vec(n, 0);
        auto t1 = std::chrono::high_resolution_clock::now();
        for (int i = 0; i < n; ++i)
            vec[i] = dist(rng);
        auto t2 = std::chrono::high_resolution_clock::now();
        auto runtime = std::chrono::duration_cast<std::chrono::microseconds>(t2-t1).count()/1000.0;
        return runtime;
    }

    int main(){
        const int n = 1000;
        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
        std::minstd_rand rng_minstd (seed);
        std::uniform_real_distribution<double> dist_double(0.0, 1.0);
        double runtime_double_minstd = timer_gen<std::minstd_rand, std::uniform_real_distribution<double>, double>(rng_minstd, dist_double, n);
    }

Это работает! Но я чувствую, что должен быть лучший способ для последней строчки. первые два параметра шаблона могут быть выведены неявно, мне нужно только перечислить их, потому что третий должен быть установлен в int. Есть лучший способ это сделать?

1
Basti 23 Апр 2014 в 00:09

2 ответа

Лучший ответ

Один из вариантов - изменить порядок параметров шаблона так, чтобы первым был указан value_type вектора. Другой вариант - установить T_vectype в качестве параметра шаблона по умолчанию на typename T_dist::result_type, который является открытым определением типа, совпадающим с типом, который вы указали для генератора случайных чисел.

1
0x499602D2 22 Апр 2014 в 20:16

Да, изменить порядок параметров:

template<typename T_vectype, typename T_rng, typename T_dist>
double timer_gen(T_rng& rng, T_dist& dist, int n){
  // .. as before
}

int main(){
    const int n = 1000;
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::minstd_rand rng_minstd (seed);
    std::uniform_real_distribution<double> dist_double(0.0, 1.0);
    double runtime_double_minstd = timer_gen<double>(rng_minstd, dist_double, n);
}

Если вы укажете менее явные аргументы шаблона, чем параметры шаблона, компилятор (попытается) вывести остальные. Это также относится к случаю «без явного указания аргументов».

1
Angew is no longer proud of SO 22 Апр 2014 в 20:12