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をクラス宣言内で定義する実装でやりました。