テンプレートクラス

型が違っても、同じ関数で取り扱うことができるテンプレート関数については、随分前にやった・・・。
テンプレートクラスはそのクラス版で、あらゆる型で同じように扱うことができるクラスである・・・。

あらゆる型を要素にできるスタッククラスを作ってみる・・・。

汎用スタックテンプレートクラスclass_stackの定義は、

こんな感じ・・・。
T型ポインタstack_にスタック用の動的配列アドレスが入る・・・。
index_はスタックポインタの現在位置、size_はスタックのサイズである・・・。
コンストラクタは、スタックのサイズを引数に取り、指定が無い場合のデフォルト値は10・・・。
T型の追加要素を引数に取る追加メンバ関数push、T型の取出し要素を戻り値とする追加メンバ関数pop・・・。

テンプレートクラスは、ヘッダとソースを分割コンパイルできないため、stack.hにメンバ関数の実装も書く・・・。

メンバ関数にもいちいちtemplate~を付けないといけない・・・。
コンストラクタは、引数のstack_sizeをメンバのsize_に格納・・・。
stack_のサイズはsize_ + 1にして、newでT型動的配列を作成・・・。
最後の要素は番兵なので-1を入れておく・・・。(使わないけど・・・。)

デストラクタは、stack_のポインタが残っていれば解放・・・。

pushは、index_がsize_と同じなら、満杯とみなし、falseを返す・・・。
そうでなければ、空いているということなので、varをstack_のindex_番目に代入・・・。
そのあとindex_を増やし、trueを返す・・・。

popの場合は、index_が0なら空ということなので、NULLを返す・・・。(std::stringなど型によっては落ちる(警告も出ている)ので、この実装は再考したほうがいい・・・。)
そうでない場合は、index_を減らしてから、stack_[index_]を戻り値に返している・・・。

main.cppは、

int型class_stackとchar型class_stackのオブジェクトをそれぞれ用意・・・。(どちらも要素数3・・・。)

int_stackに1, 2, 3、char_stackに'A', 'B', 'C'と追加してから、どちらもpopですべて取り出し、その要素を出力・・・。

実行すると、

$ g++ main.cpp -o main
$ ./main
3
2
1
C
B
A
$

3, 2, 1、そして'C', 'B', 'A'と逆方向に取り出される・・・。

Sample/cpp/template_class/template_class/src/template_class at master · bg1bgst333/Sample · GitHub