簡體   English   中英

C ++加速(Q 8-1)-由另一個函數參數化的模板函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM