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

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;
};

注意实现,有的面试题会有这样的题目,声明之后的函数可以调用,具体还是要百度模板推导,暂时写这么多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值