函数模板和类模板

举报
无敌清风蓝 发表于 2023/08/31 22:03:41 2023/08/31
【摘要】 函数模板和类模板

1.函数模板

第一种
template<typename T> //这T是类型参数

第二种
看看非类型参数怎么用
template<int a, int b>
int func()
{
    int add = a + b;  
    return add;
}
在main中
int result = func<1, 2>;

第三种
template<typename T, int a, int b>
int func(T c)
{
    int add = (int)c + a + b;
    return add;
}
在main中
int result = func<int, 11, 12>(13)   13是实参,int是类型参数
13和int对应,所以就传进去了,如果不是13,而是13.3,那会以<>里面的为准,而不是13

第四种,感觉没见过,所以先不写了

2.类模板

类模板的所有信息,不管是声明还是实现等内容,必须全部写到一个头文件里,因为实例化具体类的时候,需要知道类的所有信息

记住vector才是一个完整的类型

#pragma once
#ifndef __MYVECTOR__
#define __MYVECTOR__

template<typename T>
class myvector
{
public:
    typedef T* myiterator;

public:
    myvector();
    myvector& operator = (const myvector&);

public:
    myiterator mybegin();
    myiterator myend();

public:
    void myfunc();
};

template<typename T>
void myvector<T>::myfunc()
{

}

template<typename T>
myvector<T>::myvector()
{

}
#endif

在类模板内部,可以直接使用类模板名,而不需要在类模板名后跟模板参数,因为在类模板定义内部,如果没提供类模板参数,编译器会假定类模板名带与不带模板参数等价,也就是myvector等价于myvector

当然非要在后面跟模板参数也行

myvector&operator=(const myvector&)

但是假如在类模板定义外实现这个运算符重载,则需要这样写,需要加上模板参数T,这种写法是套路,记住就行

template

myvector& myvector::operator = (const myvector&)

{

return *this;

}

使用非类型的模板参数

template<typename T, int size = 10>
class myarray
{
private:
    T arr[size];

public:
    void myfunc();
};

template<typename T, int size>
void myarray<T, size>::myfunc()
{
    std::cout << size << std::endl;
    return;
}

但这种一般有参数限制,例如浮点型一般不能做非类型模板参数

例如这个就不行

tempalte<typename T, double size>
class myarray{---};

类类型也不能做非类型模板参数,例如

class a
{
    
};
template<typenmae T, a Size>
class myarray{---};
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。