泛型编程 基础

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>

namespace ns_template
{
//
//函数模版
//
template <typename T> //模版形参表,模版形参表可以是
//1)可以表示类型的类型形参,类型形参跟在关键字class, 或者typename之后定义,这里class和typename使用上没区别 (未知类型)
//2)可以表示 常量表达式 的非类型形参.非类型形参跟在类型说明符之后声明. (未知值)

inline
int CMP(const T& v1, const T& v2)
{
if(v1 > v2)
{
return -1;
}
if(v2 > v1)
{
return 1;
}
return 0;
}

template <typename T, typename T1>
T& output(T& out, T1 value)
{
out << value;
return out;
}

template <class it, class vl>
it find(it first, it last, vl lvalue)
{
it tmp = first;
while (tmp != last)
{
if(*tmp == lvalue)
{
break;
}
tmp++;
}

return tmp;
}
//
//class 和 typename的区别
//
/*
在函数模版形参中,class和typename具有相同的含义.可以互换,那什么情况下需要使用typename,看下面例子
*/
template <class Param, class U>
Param func(Param* Array, U value)
{
//Param::size_type *p = NULL; //size_type是一个类型成员的名字还是一个类成员的名字,编译器默认
//假定这样的名字是属于数据成员,而不是类型。如果要编译把 size_type 当作类型,需要显示告诉编译器,就是在前面加上
//typename就可以。
typename Param::size_type *p = NULL;
}

//
//非类型 模版形参。在调用函数时,非类型 模版形参 可以用值来替代。
//
template <class T, size_t N>
T* newObject()
{
return new T[N];
}


}

void test_template()
{
//
//函数模版实例化.
//
std::cout << "CMP INT :" << ns_template::CMP(1, 2) << std::endl;
std::cout << "CMP STRING : " << ns_template::CMP(std::string("hello"), std::string("sysnap")) << std::endl;

ns_template::output(std::cout, 1) << std::endl;
ns_template::output(std::cout, "hello sysnap") << std::endl;

int iarray[10] = { 1, 2, 3, 4, 5, 6, 7,8,9, 10};
std::vector<int> v(iarray, iarray + sizeof(iarray)/sizeof(int));
std::vector<int>::iterator it = ns_template::find(v.begin(), v.end(), 5);
if(it != v.end())
{
std::cout << *it << std::endl;
}

int* x = ns_template::newObject<int, 5>();

}

原文地址:https://www.cnblogs.com/sysnap/p/3463627.html