STL源碼之模版語法實現

C++中模版語法解

1, 模版參數做特殊化設計

#include <iostream>


template<class T, class O>
class ctest_class
{
public:
	ctest_class() 
	{
		std::cout << "I, O" << std::endl;
	}
	//	static int m_data;
};
//特殊化處理
template<class T>
class ctest_class<T*, T*>
{
public:
	ctest_class()
	{
		std::cout << "T*, T*" << std::endl;
	}
};

//特殊化處理
template<class T>
class ctest_class<const T*, T*>
{
public:
	ctest_class()
	{
		std::cout << "const T* , T*" << std::endl;
	}
};



int main(int argc, char *argv[])
{
	ctest_class<int, char> obj1; // T, O
	ctest_class<int*, int *> obj2; // T*, T*
	ctest_class<const int*, int*> obj3;// const T*, T*
	system("puase");
	return EXIT_SUCCESS;
}

2, 內部沒有用到這一常量定義

成員( members)函數使用template

 template<class T>
class ccalloc {};

template<class T, class Alloc = ccalloc>
class cvertor 
{
public:
	typedef T value_type;
	typedef value_type* iterator;

	template<class I>
	void insert(iterator position, I first, I last)
	{
		std::cout << "insert()" << std::endl;
	}
};

int main(int argc, char *argv[])
{

	{
		int la[5] = { 1, 3, 4,5, 6 };
		cvertor<int> x;
		cvertor<int>::iterator iter = NULL;
		x.insert(iter, la, la + 5);
	}

	system("puase");
	return EXIT_SUCCESS;
}

3, template參數可根據前一個template參數而設定默認值

class ccalloc {};


template<class T, class Alloc = ccalloc, size_t buffsize = 0>
class cdeque
{
public:
	cdeque()
	{
		std::cout << "cdeque" << std::endl;
	}
};

template<class T, class csequence = cdeque<T>>
class cstatck
{
public:
	cstatck()
	{
		std::cout << "cstatck " << std::endl;
	}
private:
	csequence m_data;
};


int main(int argc, char *argv[])
{
	{
		cstatck<int> x;

	}
	system("puase");
	return EXIT_SUCCESS;
}

4, class template 可否擁有non-type template 參數


class ccalloc {};
inline size_t __deque_buf_size(size_t n, size_t sz)
{
   return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1));
}


template<class T, class ref, class ptr, size_t bufsize>
struct  __deque_iterator
{
   typedef __deque_iterator<T, T&, T*, bufsize> iterator;
   typedef __deque_iterator<T, const T&, const T*, bufsize> const_iterator;
   static size_t buffer_size()
   {
   	return __deque_buf_size(bufsize, sizeof(T));
   }
};

template<class T, class  Alloc = ccalloc, size_t buffsize = 0>
class ccdeque
{
public:
   typedef __deque_iterator<T, T&, T*, buffsize> iterator;
};


int main(int argc, char *argv[])
{
   {
   
   	std::cout << ccdeque<int>::iterator::buffer_size() << std::endl;
   	std::cout << ccdeque<int, ccalloc, 64>::iterator::buffer_size() << std::endl;
   }

   system("puase");
   return EXIT_SUCCESS;
}

5, 模版特化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章