模板是UE中用的比多的C++特性,对于模板最近学习的心得总结如下:
模板个人的理解就是让使用者不在注意变量类型,更多的转为实现逻辑,而让编程的变量不区分变量类型,就像高级语言python一样。C++的模板编程一般分为函数模板和类模板,分别如下:
-
函数模板
函数模板的定义形式如下:
template <typename type> ret-type func-name(parameter list) { // 函数的主体 }
其中typename type这是个重要的参数,顾名思义就是类型名车,type定义了你这个后面实现函数时候你所使用的变量类型,可以这么理解,这里type取代了int,float等类型,所以模板编程也叫泛型编程。
具体的实现如下:
template <typename mytype> inline mytype const& Max (mytype const& a, mytype const& b) { return a < b ? b:a; }
我们在main函数中可以直接调用
#include <iostream> #include <string> using namespace std; //函数模板 template <typename mytype> inline mytype const& Max(mytype const& a, mytype const& b) { return a < b ? b : a; } int main() { //整数比较 int i1 = 1; int i2 = 2; cout << "Max(i, j): " << Max(i1, i2) << endl; //字符比较 char c1 = '1'; char c2 = '2'; cout << "Max(s1, s2): " << Max(c1, c2) << endl; //浮点数比较 double f1 = 1.1; double f2 = 1.2; cout << "Max(f1, f2): " << Max(f1, f2) << endl; //字符串比较 string s1 = "ABBBB"; string s2 = "BCCCC"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; }
最终输出如下:
Max(i1, i2): 2 Max(c1, c2): 2 Max(f1, f2): 1.2 Max(s1, s2): BCCCC Max(p1, p2): 0000001177F2F858
-
类模板
类模板定义形式如下:
template <class type> class class-name { }
其实用法和函数模板基本一样的,只不过用在了类里面,话不多说,我们用这个实现一个stack。
#include <iostream> template <class T> class Stack { private: T elems[100]; int index; public: Stack() { memset(elems, 0, sizeof(T) * 100); index = 0; } ~Stack() { } void push(T const& elem) { elems[index++] = elem; } T pop() { return elems[(index--)-1]; } }; int main() { Stack<int> stack_Temp; stack_Temp.push(23); stack_Temp.push(24); cout << stack_Temp.pop() << endl; return 0; }
其实上述代码没有做边界检查,可能会超范围,而且都是值拷贝的函数返回,只能用基本的类型。但是这里只是为了演示模板,所以请大家不要太纠结了。最终输出结果如下:
24
UE4中的模板编程很多,我找了一段代码,UE的数组类型:
template<typename InElementType>
class TArray
{
public:
typedef InElementType ElementType;
typedef std::vector<ElementType> TSTLVector;
void Add(const ElementType& Element)
{
Vector.push_back(Element);
}
.....
}
其实从上面可以看出,泛型编程的主要作用就是用于对位置类型的存储,逻辑等,使代码的复用性更好。