27章 テンプレートクラス
http://www.geocities.jp/ky_webid/cpp/language/027.html
テンプレート関数のクラス版です。凄くややこしそうな気がしますね。
とにかく実装してみます。
#include <iostream> using namespace std; template <class T> class CSample { public: CSample(T t) { m_t = t; } T Get () { return m_t; } private: T m_t; }; int main() { // インスタンス時に何の型かを指定する。 CSample<int> obj1(100); CSample<char*> obj2("abcd"); cout << obj1.Get() << endl; cout << obj2.Get() << endl; return 0; }
$ main 100 abcd
できました。ただchar*型は微妙かもしれません。m_tに代入する際に単なるポインタのコピーなので元データが書き換えられると変わってしまいますし。
さて、元記事ではスタックの実装をテンプレートクラスで行っています。
まったく同じだと面白くないので僕はキューの実装をテンプレートクラスでやってみようと思います。
#include <iostream> using namespace std; template <class T> class CQueue { public: CQueue (); void push(const T& data); T shift (); private: static const int QUEUE_SIZE = 6; T m_data[QUEUE_SIZE]; int m_sp; int m_ep; int nextkey(int num); }; template <class T> CQueue<T>::CQueue () { m_sp = 0; m_ep = 0; } template <class T> int CQueue<T>::nextkey (int num) { return (num + 1) % QUEUE_SIZE; } template <class T> void CQueue<T>::push (const T& data) { if ( nextkey(m_sp) == m_ep ) { cout << "キューが満タンです" << endl; return; } m_data[m_sp] = data; m_sp = nextkey(m_sp); } template <class T> T CQueue<T>::shift () { if ( m_sp == m_ep ) { cout << "キューがありません" << endl; return 0; } T data = m_data[m_ep]; m_ep = nextkey(m_ep); return data; } int main () { CQueue<int> queue; queue.push(100); queue.push(200); queue.push(300); queue.push(400); queue.push(500); queue.push(999); // 満タン cout << queue.shift() << endl; cout << queue.shift() << endl; queue.push(600); queue.push(700); queue.push(999); // 満タン cout << queue.shift() << endl; cout << queue.shift() << endl; cout << queue.shift() << endl; cout << queue.shift() << endl; cout << queue.shift() << endl; cout << queue.shift() << endl; // 空っぽ return 0; }
キューが満タンです 100 200 キューが満タンです 300 400 500 600 700 キューがありません 0
ばっちり動いてますね。
一応今回はVC2008使っているのでenumハックを使わずにstatic constをクラス宣言内で定義する実装でやりました。