找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 1714|回复: 10

C++进阶教程之模板2--简略 模板类( 附视频)

[复制链接]

该用户从未签到

1

主题

6

帖子

6

积分

LV.1

Rank: 1

积分
6
QQ
发表于 2016-10-15 22:30:29 | 显示全部楼层 |阅读模式
中国AR网(微信大众,号:armeiti)
1.一个简略的模板类示例
#include <iostream>
#include <string>
template<typename T>
class Array
{
public:
T& operator[](int idx)
{
return m_buf[idx];
}
private:
T m_buf[100];
};
int main()
{
Array<int> test_i;
Array<std::string> test_s;
test_i[0] = 5;
test_s[0] = "aaa";
std::cout << "test_i[0]=" << test_i[0] << std::endl;
std::cout << "test_s[0]=" << test_s[0] << std::endl;
system("pause");
return 0;
}
我在这里简略的写了个用于封装一个可以兼容任何类型的数组的类Array。他只有一个对方括号进行重载的函数,就是想通俗的数组一样,可以经由过程方括号对内部数组的每一个成员进行拜访。
下面我们来剖析一下这个模板。
他的格局貌似很简略,前面说的模板函数似乎也没什么差别~
也就是
template<typename 类型1...,typename 类型n>
class 类名称
{
类内容...
....
} ;
然后实在和模板函数也差未几,我们代码在最上面声明一个模板参数T,则在类内就可以应用这个模板参数了。
就如许,一个最简略的模板类基础就完成了。
2.类模板的特化
我们在给我们的Array模板增添一个函数,assign。代码如下
template<typename T>
class Array
{
public:
T& operator[](int idx)
{
return m_buf[idx];
}
void assign(T value)
{
for (int i = 0; i < size; ++i)
{
m_buf = value;
}
}
private:
T m_buf[100];
};
此中assign就是将array类封装的buf值全体改为value值。
这个函数原来没什么题目,可是我们知道,大量量变量赋值为统一个值,效力最高的是应用memset,可是memset函数是依照字节进行赋值的,也就意味着,须要假如T的类型为bool型或者char型的话,我们assign函数就可以应用memset来实现。
这个需求在实在就叫做特化,意思是对模板的特别参数进行特别处置的意思。
下面我们就简略的实现一下。
template<typename T>
class Array
{
public:
T& operator[](int idx)
{
return m_buf[idx];
}
void assign(T value)
{
for (int i = 0; i < size; ++i)
{
m_buf = value;
}
}
private:
T m_buf[100];
};
template<>
class Array<char>
{
public:
char& operator[](char idx)
{
return m_buf[idx];
}
void assign(char value)
{
memset(m_buf, value, 100);
}
private:
char m_buf[100];
};
然后我们就可以看下模板特化的语法是若何的
template<>
class 模板类名称<特化的模板参数值>
{
...
}
也长短常简略的。
3.非类型模板参数
看我开端写的示例代码中,是不是感到,固然封装了一个数组,可是数组的巨细没措施修正呢???
能不克不及用模板来传进数组巨细的参数呢?
下面我们看看这一段代码
template<typename T, int size>
class Array
{
public:
T& operator[](int idx)
{
return m_buf[idx];
}
private:
T m_buf[size];
};
这里面的模板参数中增添了一个int size,可是和以前的模板参数分歧,以前我们接触的模板参数都是个类型,可是此次我们的模板参数竟然和函数参数一样,是个int size。
对我们的参数实在并不是只能是类型,也可所以变量的,当然,函数模板也可以在模板中传进变量,可是因为函数参数中也能传进变量,所以凡是我们不会在函数模板中传进变量,只会在类模板中传进变量。
不外这里必需要说一下,模板参数只能传进整数类型的变量,这个整数类型的寄义实在有点年夜,包含bool,char,int。而像什么类类型的,构造体类型的,浮点类型的变量是不克不及经由过程函数模板进行传递的。
4.偏特化(局部特化)
template<typename T1, typename T2>
class TestClass
{
...
};
template<typename T>
class TestClass<T, int>
{
...
};
template<typename T>
class TestClass<T, T>
{
...
};
template<typename T1, typename T2>
class TestClass<T1*, T2*>
{
...
};
偏特化和特化的格局实在是很像的,可是呢,他的模板参数只是断定了部门,好比说我们代码中的偏特化分辨只是断定了
第二个参数为int型
两个参数类型雷同
两个参数都是指针型。
实在常用的偏特化,也就这几种。
然后我们判定几种应用方法分辨应用的是哪个类。
TestClass<float, bool> value;\\匹配的是TestClass<T1,T2>
TestClass<float, int> value;\\匹配的是TestClass<T,int>
TestClass<float, float> value;\\匹配的是TestClass<T,T>
TestClass<float*, float*> value;\\匹配的是TestClass<T1*,T2*>
可是这里我就会想个题目。

TestClass<int, int> value;
这种,会匹配那种呢????
是TestClass<T,int>仍是TestClass<T,T>呢????
似乎都有点像,这里实在是显明的有二义性的,是以,这种应用编译器是会报错的。
5.缺省模板参数
我们都知道通俗的函数是出缺省参数如许的说法的
void func(int value = 0)
{
...
}
这个函数,当我们应用func(1)如许挪用的时辰,value传进的值将为1.可是当我们应用func()这种方法挪用时,value的参数将会默以为0.这就是函数的缺省参数。
当我们传进参数时,就是用我们的参数,当我们不传进参数时,就是用缺省参数。既然函数参数有这种特征,那么模板参数有这种特征么?
既然说到这了,确定是有的~
template<typename T1, typename T2=bool>
class TestClass
{
...
};
当我们应用TestClass<char>的时辰,匹配的是TestClass<char, bool>。
然后又想我们上一个教程里面的函数模板中,没说出缺省模板参数啊?实在这是通用的,函数也是可以应用缺省模板参数这个特征的。
另:视频教程:http://v.youku.com/v_show/id_XMTYyMjY0MDI0MA==.html?f=27489531
更多AR教程就在中国AR网(http://www.chinaar.com/)

该用户从未签到

2

主题

13

帖子

12

积分

LV.1

Rank: 1

积分
12
QQ
发表于 2016-10-15 22:55:38 | 显示全部楼层
看帖怎么能不会呢??

该用户从未签到

2

主题

16

帖子

17

积分

LV.1

Rank: 1

积分
17
QQ
发表于 2016-10-15 22:57:25 | 显示全部楼层
竟然还有零回复,给我消失

该用户从未签到

5

主题

11

帖子

13

积分

LV.1

Rank: 1

积分
13
QQ
发表于 2016-10-15 23:57:13 | 显示全部楼层
增强现实希望发展越来越好

该用户从未签到

2

主题

73

帖子

59

积分

LV.2

Rank: 2

积分
59
QQ
发表于 2016-10-16 17:43:14 | 显示全部楼层
想了解下AR增强现实的相关内容来看看

该用户从未签到

2

主题

52

帖子

6

积分

LV.1

Rank: 1

积分
6
发表于 2016-10-17 07:07:58 | 显示全部楼层
楼主写的很不错,关于AR的知识受教了

该用户从未签到

3

主题

14

帖子

14

积分

LV.1

Rank: 1

积分
14
QQ
发表于 2016-10-17 14:50:21 | 显示全部楼层
增强现实,增强现实,增强现实。重要的事情说三遍

该用户从未签到

1

主题

12

帖子

8

积分

LV.1

Rank: 1

积分
8
QQ
发表于 2016-10-19 09:29:13 | 显示全部楼层
楼主辛苦了,帮楼主顶起来

该用户从未签到

4

主题

30

帖子

34

积分

LV.1

Rank: 1

积分
34
QQ
发表于 2016-10-19 12:13:10 | 显示全部楼层
嗯,很不错的样子!!

该用户从未签到

2

主题

12

帖子

13

积分

LV.1

Rank: 1

积分
13
QQ
发表于 2016-10-19 12:30:12 | 显示全部楼层
楼主辛苦了。。回帖是一种美德
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表