如何实现一个函数要求返回两个数之和?
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;
}
参考文资料: