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

函数指针

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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值