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;
}