C ++函数模板,混合隐式和显式实例化?

时间:2014-04-22 20:09:56

标签: c++ templates

所以我想编写一个测量随机数生成的运行时间的函数。为了能够使用不同的随机引擎和发行版,我使用模板,但我还需要一个模板参数来初始化我写入数字的向量。

    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。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

是,更改参数的顺序:

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 :(得分:1)

一个选项是重新排列模板参数的顺序,以便首先指定向量的value_type。另一个选项是将T_vectype设置为typename T_dist::result_type的默认模板参数,这是暴露的typedef别名为您为随机数生成器指定的类型。