[英]C++ accelerated (Q 8-1) - Template function parameterised by another function
我在這里看到了一些有關模板功能的使用以及C ++ Accelerated(Koeing / Moo)一書中的問題的帖子,但是它們都沒有回答我的問題,因此希望您能提供幫助。
我正在努力的問題是; “我們編寫的Sect 6.2 / 110中的各種分析函數具有相同的行為;它們只是在計算最終成績時所用的函數不同。編寫一個模板函數,並根據該函數的類型對其進行參數化,並使用評估評分方案的功能。”
我仍處於學習的早期階段,對此問題我將不勝感激,因為我一直堅持該問題已有數周之久,並且沒有使用Googling進行過任何幫助。 我讀過的所有內容都涉及引用或指針-本書尚未涵蓋,因此我感到更加困惑。
我已經在下面包含了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) ;
我不能說足夠多的幫助。 先感謝您。
最后,我設法找到了解決之道,並認為我可以分享,以防其他人同樣陷入困境。
#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));
這是我能想到的最好的解決方案,但是如果有人對如何改進它有任何意見,那將是很好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.