-
模板参数可以是数值型参数(非类型参数)
template <typename T,int N>
void func()
{
//使用模板参数定义局部数组
T a[n];
}
-
数值型模板参数的限制
-
变量不能作为模板参数
-
浮点数不能作为模板参数
-
类对象不能作为模板参数
-
本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确认。
-
有趣的题目:使用最高效的方法求1+2+3+4+...+N的值!
-
答案
#include <iostream>
#include <string>
using namespace std;
template
<int N>
class Sum
{
public:
static const int value = Sum<N - 1>::value + N;
};
template
< >
class Sum <1>
{
public:
static const int value = 1;
};
int main()
{
cout << "1+2+3+4+....+100=" << Sum<100>::value << endl;
}
-
数组类模板范例程序
mian.cpp
#include <iostream>
#include <string>
#include "Array.h"
using namespace std;
int main()
{
Array<int, 5> array;
for (int i =0;i<array.length();i++)
{
array.operator[](i)= i * i;
}
for (int i =0;i<array.length();i++)
{
cout << array[i] << endl;
}
return 0;
}
Array.h
#ifndef _ARRAY_H_
#define _ARRAY_H_
template <typename T,int N>
class Array
{
T m_value[N];
public:
int length();
bool get_value(int index,T& value) ;
bool set_value(int index,T value);
//这个地方需要注意:如果数组类对象要做左值,需要返回一个引用,因为函数调用不能做左值
//例:
//Array<int, 5> array;
//array.operator[](2)= 3;
T& operator [] (int index);
T operator [] (int index) const;
virtual ~Array();
};
template <typename T, int N>
int Array<T,N>:: length()
{
return N;
}
template <typename T,int N>
bool Array<T, N>::get_value(int index, T& value)
{
bool ret = (0 <= index) && (index <= N);
if (ret)
{
value = m_value[index];
}
return ret;
}
template <typename T, int N>
bool Array<T, N>::set_value(int index, T value)
{
bool ret = (index >= 0) && (index < N);
if (ret)
{
m_value[index] = value;
}
return ret;
}
template <typename T, int N>
T& Array<T, N>::operator[] (int index)
{
return m_value[index];
}
template <typename T, int N>
T Array<T, N>::operator[] (int index) const
{
return m_value[index];
}
template <typename T, int N>
Array<T, N>::~Array()
{
}
#endif
-
小结
-
模板参数可以是数值型参数
-
数值型参数必须在编译期间唯一确认
-
数组类模板是基于数值型模板实现的
-
数组类模板是简易的线性表数据结构
来源:https://www.cnblogs.com/chengeputongren/p/12283654.html