您的位置:首页 > 编程语言 > C语言/C++

C++模板--函数模板基本 说明

2017-12-19 16:05 246 查看
C++模板是个很重要的东西,但是现实中,我几乎没写过模板,几乎都快忘记这个东西,前两天学习了,意识到这个问题,主要是准备学习C++11,初步学习,举步维艰,发现不会模板学习有些费劲,觉得很难理解,所以今天来说明下函数模板最基本说明,其实模板挺复杂的,应该,我只看了一点都觉的很绕,还有很多坑,估计这个写本书没啥问题,我也只是记录基本程度的一点心得,

一 重要的规则:这一点很多资料能说出一堆,说的很多很细致,我来说几个比较重要的,

1.模板类型,推荐用typename,虽然效果等同于class,但是有些场合必须使用typename ,当然这个尤其是使用类模板时你会用的到,应该是成员函数模板(类模板还没开始学习呢)

2.指定的非类类型(不是class,基本类型比如int,double),只能使用int类型,template,其他类型不允许,(char貌似也是可以,某种程度的int,可能是这个原因吧)

template<double>
void f()
{
cout << "double" << endl;
}


这段代码放到VS2003下编译没问题,但Ubuntu,gcc5.4有问题,我记得使用VS2017也是不行的,这很可能是C++11已经不支持这个了,在VS2003下甚至可以f<5.5>(),但是C++11不支持,指针和引用都是可以的,如double*,

3 具体化类型要使用全局变量或者常量,这个涉及到模板的类型推导,可以自行百度,模板类型推导是编译期间的事情,根据传入类型和函数参数推导,我也是看的一知半解,不详细,比如有时&会无效,const会无效

4 模板的支持,这个是百度来的,C++支持两种编译模式,一个是通用的编译模式,一个是支持分开编译模式(据说有的编译期支持,但是不知道什么编译期支持),为了通用,我们只能选择写在同一个文件,因为我们一般.h,cpp分开写,所以一般通用做法是写 .h, 声明和实现可以分开写,但是一定要写在同一个文件,否则会发生连接错误,这个具体原因可以百度,首先记住这个规则就好

二 代码示例比较容易些,网上能找到一片

1 普通

template<typename T>//1 普通模板
void fun(T a)
{
//  a = 10;
cout << a << endl;
}
template<>          //2 特化模板
void fun<int>(int a)
{
a = 11;
cout << a << endl;
}
template<int val> //3 实际是普通模板
void fun(int a)
{
a = val;
cout << a << endl;
cout << val << endl;
}
int main()
{
int a;
fun<double>(a);//1
fun<int>(a);//2
fun<5.5>(a);//3
}


如上,这里要说明的是,第二个特化模板不能单写的,必须先有普通模板,然后写上特化模板才行,只写特化模板会直接报错,第三个,实际是一个明确类型的普通模板,这个的一些规则我们上面讲过,常量,全局变量能让他推导出类型的参数,这个可以单独写出来,尽管,有时候你可以fun(a)不加<>也能匹配,但个人觉得这个并不好,C++的语法让人讨厌的一个地方,

其中第三个,C++11中分数就是这么搞得,当时看的我头晕,所以只能回头看模板怎么写

2 指针和引用

template<double* val>
void fun(double d)
{
cout << *val << endl;
cout << d << endl;
}
double d = 10.0;
int main()
{
fun<&d>(100.1);
}


这个搞了很久,才明白是这么调用的,记得我们上面的规则,明确类型,只准使用int

3 同一个文件声明和实现可以分开写

template<char T>
void foo();
int main()
{
foo<'c'>();
getchar();
return 0;
}
template<char T>
void foo()
{
cout << "char" << endl;
};


注意实现,有的面试题会有这样的题目,声明之后的函数可以调用,具体还是要百度模板推导,暂时写这么多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: