C++函数模板详解

如何实现一个函数要求返回两个数之和?

1.由于宏定义没有类型要求,宏定义符合此题要求;   

#define Sum(a,b) ((a)+(b))
2.函数重载,重载次数太多,不可取;

3.泛型编程,函数设计复杂,有难度;

4.考虑c++的函数模板。


函数模板的使用

在学习函数模板之前,需要明确函数模板和模板函数两个概念。

函数模板:一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。函数模板只是声明了一个函数的描述,不是一个可执行的函数,只有根据实参的数据类型代替类型参数标识符后,才能产生真正的函数。

模板函数:当编译器发现有函数调用时,将根据模板实参表的类型生成一个函数,是一个具体的全局函数。

template <typename T>
T Sum(T a,T b)//函数模板
{
    cout << typeid(T).name <<endl;
    return a+b;
}

函数模板编译:1.编译模板头部,在模板调用点;

   2.编译模板体,在模板调用点进行编译。

int main()
{
    int a = Sum<int>(10,20);//规范的调用
    double b = Sum(10.1,20.2);//类型推演
    return 0;
}
模板实参类型推演:1.不能产生二义性;

    2.不能没有参数。


模板的特例化

如果需要对特定的数据类型执行不同的代码,就可以使用模板特例化。

template<>
char* Sum<char*>(char* des,char* src)
{
    char *p = new char[strlen(des)+strlen(src)+1]();
    strcpy(p,des);
    strcat(p,src);
    return p;
}
特例化的Sum函数是一个模板函数,并且会被编译器编译。 特例化时需要注意参数类型匹配问题

template <typename T>
bool strcmp_tem(const T a,const T b)
{
	return a>b;
}
/*
template <>
bool strcmp_tem<char*>(const char *a,const char *b)//参数类型不匹配,非模板函数特例化
{
	return strcmp(a,b);
}
*/
template <>
bool strcmp_tem<char*>( char *const a,char *const  b)//模板函数的特例化
{
	return strcmp(a,b);
}



举一反三,实现一个模板函数调用普通全局函数和类的成员函数
void Show()
{
	cout<<"hello"<<endl;
}
class Node
{
public:
    void Show()
    {
        cout<< "world" <<endl;
    }
}
template <typename T>
void operation_fun(T(*pfun)())
{
    (*pfun)();
}
template <typename T>
void operation_class(T (Node::pfun)())
{
    Node n;
    (n.*pfun)();
}
int main()
{
    operation_class(&Node::Show);
    operation_fun(&Show);
    return 0;
}



参考文资料:

C++模板:函数模板和模板函数 - CSDN博客


发布了26 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Teemo_king/article/details/79149650