2016-02-16 17 views
0

我在這裏看到了一些關於使用模板函數和關於C++ Accelerated(Koeing/Moo)書中的問題的文章,但沒有一篇回答我的問題,所以我希望你能幫助。C++加速(Q 8-1) - 由另一個函數參數化的模板函數

我正在努力的問題是; 「我們編寫的各種分析函數是Sect 6.2/110共享相同的行爲;它們僅在它們調用的用於計算最終成績的函數方面有所不同。編寫一個模板函數,根據等級函數的類型進行參數化,並使用該功能來評估分級方案「。

我還處於學習的初期階段,我真的很感謝這個問題的一些幫助,因爲我一直堅持了幾個星期,沒有任何Google搜索幫助過。我讀過的所有東西都是指引用,或指針 - 這本書尚未涉及,所以我覺得它更令人困惑。

我已經包含了下面的3個分析函數 - 我想這個問題是要求我編寫一個模板函數,它將取代所有的3.我寫了一個我認爲可以工作的函數 - 見下文 - 但我得到當我嘗試編譯時發生錯誤,因爲使用所有原始分析函數的函數write_analysis無法應付我的模板函數。

我完全卡住了,真的很感激任何幫助。

我已經嘗試過不要包含太多的代碼,所以我希望以下是足夠的。

double median_analysis(const vector<Student_info>& students) 
{ 
    vector<double> grades; 
    transform(students.begin(), students.end(),back_inserter(grades), grade_aux); 

    return median(grades); 
} 



double optimistic_median_analysis(const vector<student_info>& students){ 

vector<double> grades ; 

transform(students.begin(), students.end(), back_inserter(grades), optimistic_median) ; 

return median(grades) ; 

} 


double average_analysis(const vector<Student_info>& students) 
{ 
vector<double> grades; 
transform(students.begin(), students.end(),back_inserter(grades), average_grade) ; 

return median(grades); 
} 

我的模板功能;

template <typename F > double Tanalysis(F Func(const student_info&)) 
{ 

std::vector<double> grades ; 

transform(students.begin(), students.end(), back_inserter(grades), Func) ; 

return median(grades) ; 
} 

write_analysis函數;

void write_analysis(ostream& out, const string& name, 
       double analysis(const vector<student_info>&), 
       const vector<student_info>& did, 
       const vector<student_info>& didnt){ 

    out << name << " : median(did) = " << analysis(did) << 
        " : median(didnt) = " << analysis(didnt) << endl ; 

    } 

在main.cpp中調用如下;

write_analysis(cout, "median", median_analysis, did, didnt) ; 

我不能說足夠多的我會感謝一些幫助。先謝謝你。

+1

我認爲這個問題只涉及第一種和第三種方法,因爲它們實際上是相同的。 –

+0

要解決這個問題,請思考這兩種方法共享的內容,以及它們不共享的內容。任何常見的功能都可以保留在方法中,並且可以通過模板專門化來處理任何差異。 –

+0

這本書說「寫一個分析函數來調用我們的'optimistic_median'函數」。這個分析函數應該看起來像你的第一個和第三個方法,而不是'optimistic_median'函數本身。 –

回答

0

我終於找到了解決問題的方法,並認爲我會分享以防其他人同樣被困在這個問題上。

#include<vector> 
#include<algorithm> //transform 

#include "student_info.h" 
#include "median.h" 

template <typename F> 
double Tanalysis(F Func, std::vector<student_info> students) 
{ 
    std::vector<double> grades ; 

    transform(students.begin(), students.end(), back_inserter(grades), Func) ; 

    return median(grades) ; 
} 

上述模板本身在main.cpp中的作用如下所示;

double ans = Tanalysis(grade_aux,did) ; 
double ans2 = Tanalysis(grade_aux, didnt) ; 

cout << "And the Answer for did is: " << ans << 
    ". The Answer for didnt is: " << ans2 << endl ; 

爲了讓它與write_analysis函數一起工作,我必須對它進行模板化。

template <typename F, typename F2> 
void Twrite_analysis(ostream& out, const string& name, F Func, F2 Func2) 
{ 
    out << name << " : median(did) = " << Func << 
        " : median(didnt) = " << Func2 << endl ; 
} 

在main.cpp中調用如下:

Twrite_analysis(cout, "median", Tanalysis(grade_aux, did), Tanalysis(grade_aux, didnt)); 

這是我能拿出最好的解決辦法,但如果任何人有關於如何提高它的任何評論,這將是很好的。