c++函数模板与函数指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc15766228491/article/details/84979726

函数指针

1、概念:与数据项相似,函数也有地址,函数的地址是存储其机器语言代码的内存的开始地址。获取函数的地址很简单:只要使用函数名(后面不跟参数)即可。也就是说,如果think()是一个函数,则think就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。(《C++ Primer Plus 中文版》(第五版 p216))

2、声明函数指针:double(*pf)(int),即声明了一个函数指针,这个指针指向的函数是:参数为int,返回值为:double

3、赋值和调用

#include <iostream>
using namespace std;
double func(int a)
{
    cout<<a<<endl;
}
int main()
{
    double (*p)(int);
    p = func;
    p(10);
}
// 输出10

或用typedef定义

#include <iostream>
using namespace std;
typedef double (*P)(int);
double func(int a) {
    cout<<a<<endl;
}
int main()
{
   P p=func;
   p(10);
   // (*p)(10)  //结果一样
}
// 输出10

注:上面的例子中,p(10)和(*p)(10)等价。

函数模板和函数指针

可以使用函数模板对函数指针进行初始化或赋值,这样做的时候,编译器使用指针的类型实例化具有适当模板实参的模板版本(《C++ Primer 中文版》(第四版 p539))这句话我看了好几遍,写的实在太难理解了,我的理解:用函数模板对函数指针进行初始化或赋值的时候,编译器就可以找一个合适的函数进行调用。。。。

/*
 * 下面这个例子是说,func里面要传递不同的参数,但是在执行里面代码之前,要先判断传进来的参数的大小
 * 如果把函数模板放入两个函数,然后进行重载,会出现代码的部分冗余,因此这里考虑用模板把公共操作提出来
 */
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 定义一个函数模板
template<typename T>
int compare(const T &t1, const T &t2){
    return t1>t2? 1: 0;
}
// 两个同名的函数,第一个参数都是函数指针
void func(int(*F)(const int&a, const int&b), int a, int b){
    if(F(a, b)) cout<<"int 1"<<endl;
    else cout<<"int 2"<<endl;
}

void func(int(*F)(const double&a, const double&b), double a, double b){
    if((*F)(a, b)) cout<<"double 1"<<endl;
    else cout<<"double 2"<<endl;
}

int main()
{
    int a = 10, b = 20;
    double c = 30.0, d = 20.0;
    func(compare<int>, a, b);
    func(compare<double>, c, d);
}
/*
int 2
double 1
 */

模板编译模型

1、包含编译模型:编译器必须看到用到的所有模板的定义。一般而言,可以通过在声明函数模板或类模板的头文件中添加一条 #include 指示使定义可用,如下:

main.cpp
/*
 * 下面这个例子是说,func里面要传递不同的参数,但是在执行里面代码之前,要先判断传进来的参数的大小
 * 如果把函数模板放入两个函数,然后进行重载,会出现代码的部分冗余,因此这里考虑用模板把公共操作提出来
 */
#include <iostream>
#include <vector>
#include <string>
#include "new_h.h"
using namespace std;
// 定义一个函数模板

int main()
{
    int a = 10, b = 20;
    double c = 30.0, d = 20.0;
    func(compare<int>, a, b);
    func(compare<double>, c, d);
    show();
    show();
}
/*
int 2
double 1
 */
new_h.h
#ifndef NEW_H_H
#define NEW_H_H

#include <iostream>
using namespace std;
void show();

#include "learn_temp.cpp"
template <typename T> int compare(const T&, const T&);


void func(int(*F)(const int&a, const int&b), int a, int b);
void func(int(*F)(const double&a, const double&b), double a, double b);

#endif

learn_temp.cpp
template <typename T> int compare(const T&a, const T&b){
    return a>b?1:0;
}
test1.cpp
#include "new_h.h"
void show(){
    cout<<"show"<<endl;
}

void func(int(*F)(const int&a, const int&b), int a, int b){
    if(F(a, b)) cout<<"int 1"<<endl;
    else cout<<"int 2"<<endl;
}

void func(int(*F)(const double&a, const double&b), double a, double b){
    if((*F)(a, b)) cout<<"double 1"<<endl;
    else cout<<"double 2"<<endl;
}

结果:

int 2
double 1
show
show

猜你喜欢

转载自blog.csdn.net/abc15766228491/article/details/84979726