C++加速 (Q 8-1) - 由另一个函数参数化的模板函数

C++ accelerated (Q 8-1) - Template function parameterised by another function

本文关键字:函数 参数 另一个 加速 C++      更新时间:2023-10-16

我在这里看到了一些关于模板函数的使用和《加速C++》(Koeing/Moo(一书中的问题的文章,但没有一篇回答我的问题,所以我希望你能提供帮助。

我正在努力解决的问题是;"我们编写的各种分析函数是第 6.2/110 节,具有相同的行为;它们的区别仅在于它们调用的用于计算最终成绩的函数。编写一个模板函数,按评分函数的类型进行参数化,并使用该函数评估评分方案。">

仍处于学习的早期阶段,我真的很感激这个问题的一些帮助,因为我已经被困住了几个星期,而且谷歌搜索也没有帮助。我读到的所有内容都涉及引用或指针 - 这本书还没有涉及,所以我发现它更令人困惑。

我在下面包含了 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 ; 
     }

在主.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 ; 
}

在主.cpp中调用如下;

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

这是我能想到的最好的解决方案,但如果有人对如何改进它有任何意见,那就太好了。