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;
}