2014-04-22 1 views
1

그래서 난수 생성의 런타임을 측정하는 함수를 작성하고 싶습니다. 나는에 숫자를 쓰기 벡터를 초기화하기 위해, 나는 사람들을위한 템플릿을 사용하지만, 나는 또한 템플릿 매개 변수를 필요로 서로 다른 임의의 엔진과 분포를 사용할 수있게합니다.이 작동C++ 함수 템플릿, 암시 적 및 명시 적 인스턴스화를 혼합 하시겠습니까?

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

하나의 옵션은 벡터의 value_type이 먼저 지정되도록 템플릿 매개 변수의 순서를 재정렬하는 것입니다. 또 다른 옵션은 기본 서식 파일 매개 변수로 T_vectypetypename T_dist::result_type으로 설정하는 것입니다. typename T_dist::result_type은 난수 생성기에 대해 지정한 형식의 별칭 인 노출 된 typedef입니다.

+0

와우, 나는 : result_type에 대해 몰랐다. 작품, 매우 도움이! – Basti

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

를, 컴파일러는 나머지 추론 (시도)됩니다. 또한 "명시 적으로 명시된 인수가 없습니다."

관련 문제