にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

不定期C++勉強 - テンプレート関数・クラス

オーバーロードで同じ名前の関数を作れるようになったけど、型が異なっても共通の動作をするような関数を型ごとに作るのではなく一つだけで定義できるようにしたい、つーかさせろ」という要求に応えたのがテンプレート、という理解。
しかしテンプレートクラスの定義はヘッダファイル内にしなくちゃならないとか、結構ややこしい。
とりあえず、無理やりFIFOキューもどきのようなものをテンプレートクラスを使って書いてみた。

myqueue.h

#include <iostream>
using namespace std;

template <class T>
class MyQueue
{
public:
    void enqueue(T *t);
    T *dequeue();
    MyQueue() {
        front = NULL;
        rear = NULL;
    }
private:
    struct cell {
        T *value;
        struct cell *next;
    };
    struct cell *front;
    struct cell *rear;
};

template <class T>
void MyQueue<T>::enqueue(T *t) {
    struct cell *item = new cell;
    item->value = t;
    if (front == NULL) {
        front = item;
        rear = item;
    } else {
        rear->next = item;
        rear = item;
    }
    rear->next = NULL;
    cout << "enqueue: " << *item->value << endl;
        
    return;
}

template <class T>
T* MyQueue<T>::dequeue() {
    T* ret;
    struct cell *i;
    if (front == NULL) {
        return NULL;
    }
    i = front;
    front = front->next;
    ret = i->value;
    delete i;
    
    return ret;
}

myqueue.c (main関数のみ)

#include <iostream>
#include "myqueue.h"
using namespace std;

int main(int argc, char *argv[])
{
    MyQueue<int> que;
    int x=10, y=20, z=30;

    que.enqueue(&x);
    que.enqueue(&y);
    que.enqueue(&z);
    cout << "dequeue: " << *que.dequeue() << endl;
    cout << "dequeue: " << *que.dequeue() << endl;
    cout << "dequeue: " << *que.dequeue() << endl;

    return 0;
}

実行結果

$ ./myqueue
enqueue: 10
enqueue: 20
enqueue: 30
dequeue: 10
dequeue: 20
dequeue: 30

慣れないことをするのは大変ですな。非常に使いづらいキューです。
とりあえずどういうものかはわかったからよしとする。