[C/C++]_[簡単な例はテンプレートtemplateの特性を見る]


シーン:
1.テンプレートはC++の中で必ず少なくない文法の特性で、特にコードに対して再利用して、アルゴリズム、データ構造をカスタマイズして符号化する時極めて大きい重複コードを減らすことができて、コードのメンテナンス量を減らす.
2.以下のコードは<16.1,16.2,16.3章を学習した.
コード:test_template.cpp
#include <stdlib.h>
#include <string>
#include <iostream>
#include <string.h>

//1.    
template <typename Type> class QueueItem;

//2.      template <class or typname keyword,parameter list>
//5.          .
//6.                 
template <typename Type,int id,typename Info = std::string>
class Queue
{
public:
	Queue(Info info):front_(NULL),last_(NULL),size_(0),info_(info),id_(id){}
	Type& Front();
	void Pop();
	void Push(const Type& val);
	bool IsEmpty()
	{
		return front_ == NULL;
	}
	size_t Size()
	{
		return size_;
	}
	Info& GetInfo()
	{
		return info_;
	}
	int GetId()
	{
		return id_;
	}
private:
	QueueItem<Type> *front_;
	QueueItem<Type> *last_;
	size_t size_;
	Info info_;
	int id_;
};


template <typename Type> class QueueItem
{

public:
	//4.           ,             .
	QueueItem(const Type& type):item(type),next_(NULL){}
	Type item;
	QueueItem<Type> *next_;
};

//7.                                     
//                 template       
template <typename Type,int id,typename Info>
Type& Queue<Type,id,Info>::Front()
{
	return front_->item; 
}

//3.      
template <typename Type,int id,typename Info>
void Queue<Type,id,Info>::Pop()
{
	QueueItem<Type> *temp = front_;
	front_ = front_->next_;
	delete temp;
	--size_;
}

template <typename Type,int id,typename Info>
void Queue<Type,id,Info>::Push(const Type& val)
{
	QueueItem<Type> *p = new QueueItem<Type>(val);
	if(last_)
	{
		last_->next_ = p;
		last_ = last_->next_;
	}else
	{
		front_ = p;
		last_ = p;
	}
	++size_;
}

int main(int argc, char const *argv[])
{
	//6.                 
	Queue<std::string,11> q("fisrt q");
	q.Push("hello");
	q.Push("world");
	q.Push("Sai");

	std::cout << q.Size() << std::endl;
	std::cout << q.GetInfo() << std::endl;
	std::cout << q.GetId() << std::endl;
	while(!q.IsEmpty())
	{
		std::string& str = q.Front();
		std::cout << str << std::endl;
		q.Pop();
	}

	Queue<std::string,12> d("second d");
	d.Push("default");
	d.Push("Type");
	d.Push("is");
	d.Push("std::string");

	std::cout << d.Size() << std::endl;
	std::cout << d.GetInfo() << std::endl;
	std::cout << d.GetId() << std::endl;
	while(!d.IsEmpty())
	{
		std::string& str = d.Front();
		std::cout << str << std::endl;
		d.Pop();
	}

	return 0;
}

出力:
3
fisrt q
11
hello
world
Sai
4
second d
12
default
Type
is
std::string

2015.6.14テンプレートを追加するパラメータは関数である.
参照先:http://blog.csdn.net/infoworld/article/details/46492131
template<BOOL (WINAPI* WrapHandleFunc)(void*)>
class WrapHandle
{
public:
	WrapHandle(void* data):data_(data){}
	~WrapHandle()
	{
		if(data_)
		{
			WrapHandleFunc(data_);
			data_ = NULL;
		}
	}
private:
	void* data_;
};