2013-01-13 104 views
1

我在下面寫的函數是用來處理一個函數需要多長時間的。將函數作爲參數傳遞給C++中的模板?

// return type for func(pointer to func)(parameters for func), container eg.vector 
clock_t timeFuction(double(*f)(vector<double>), vector<double> v) 
{ 
    auto start = clock(); 
    f(v); 
    return clock() - start; 
} 

這是我想在我的timeFunction中測試的功能。

template<typename T> 
double standardDeviation(T v) 
{ 
    auto tempMean = mean(v); //declared else where 
    double sq_sum = inner_product(v.begin(), v.end(), v.begin(), 0.0); 
    double stdev = sqrt(sq_sum/v.size() - tempMean * tempMean); 
    return stdev; 
} 

standardDiviation用模板製作,因此它可以接受任何C++容器中,我想要做與timeFunction一樣的,所以我嘗試以下。

template<typename T> 
clock_t timeFuction(double(*f)(T), T v) 
{ 
    auto start = clock(); 
    f(v); 
    return clock() - start; 
} 

但就像不能使用函數模板這給了我錯誤的「雙standardDiviation(T)」,並不能推導出模板參數爲「重載函數」

我這是怎麼叫的主要功能。

int main() 
{ 
    static vector<double> v; 
    for(double i=0; i<100000; ++i) 
     v.push_back(i); 

    cout << standardDeviation(v) << endl; // this works fine 
    cout << timeFuction(standardDeviation,v) << endl; //this does not work 

} 

我該如何修復timeFunction,以便它可以與任何C++容器一起工作。任何幫助是極大的讚賞。

+1

您正試圖傳遞一個指向函數的模板。但是沒有這樣的事情存在。 –

+0

你使用什麼編譯器?似乎在g ++上工作正常4.6.3 – Csq

+0

visual studio 2012 – user1973206

回答

0

我試着在GCC 4.7.1上編譯這段代碼。它編譯和工作正常。你使用什麼編譯器?如果不能推導出模板參數然後嘗試明確的指定,即使用:

cout << timeFuction(standardDeviation< vector<double> >,v) << endl; 

而且,提問的時候,你應該嘗試刪除所有不必要的代碼。

#include <iostream> 
#include <vector> 

using namespace std; 

template<typename T> 
double standardDeviation(T v) 
{ 
    return 5; 
} 

template<typename T> 
int timeFuction(double(*f)(T), T v) 
{ 
    // auto start = clock(); 
    f(v); 
    return 0;//clock() - start; 
} 

int main() 
{ 
    static vector<double> v; 
    for(double i=0; i<100000; ++i) 
     v.push_back(i); 

    cout << standardDeviation(v) << endl; // this works fine 
    cout << timeFuction(standardDeviation,v) << endl; // this also work 

    return 0; 
} 
+0

我正在使用Microsoft Visual Studio 2012.我目前正在下載Visual Studio 2010,我將嘗試使用它編譯代碼。 – user1973206

+0

它在MinGW-g ++ - 4.6.2上編譯得很好 – prajmus

+0

我指定了模板參數,它可以工作。非常感謝。 – user1973206

相關問題