GW課題として汎用なスタックを作ることにしました。
進捗:テンプレートクラスによる実現 → テンプレートでは多用性が低いと感じてvoid*使うことにした → もはやC++ではないと感じた(Cに逆戻り?)
もう一つの主旨をいうとエラーにぶち当たりました。void*にNULLを返そうとすると異常終了してしまいます。
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
enum {NOTHING,CHAR,INT,DOUBLE,STRING};
class stack{
stack *head,*next;
const void *value;
int type;
public:
void push(const void*,int);
int get_type();
const void *pop();
};
void stack::push(const void *obj,int t){
stack *p = new(nothrow) stack;
if(!p) return ;
p->value = obj;
p->type = t;
p->next = NULL;
if(head) p->next = head;
head = p;
}
int stack::get_type(){
return (head) ? head->type:NOTHING;
}
const void *stack::pop(){
stack *p = head;
const void *obj;
if(!p) return NULL;
obj = p->value;
head = p->next;
delete p;
return obj;
}
int main(){
stack stk;
int t;
int a=12;
double b=3.34;
char c='\\';
const void *v;
stk.push(&c,CHAR); stk.push(&b,DOUBLE); stk.push(&a,INT); stk.push("is ",STRING); stk.push("pen ",STRING); stk.push("this ",STRING);
while((t=stk.get_type())!=NOTHING){
v=stk.pop();
switch(t){
case CHAR : cout << *(char*)v;break;
case INT : cout << *(int*)v;break;
case DOUBLE : cout << *(double*)v;break;
case STRING : cout << (char*)v;break;
default : exit(1);break;
}
}
return 0;
}