Sou*_*aji 5 c stack data-structures
我想设计一个可以包含不同类型(int、float、double 或 char)对象的堆栈。堆栈的类型取决于声明。这可以在模板的帮助下使用 C++ 轻松实现。我想知道如何在没有模板的 c 中完成它......?这是我所做的基本定义:
#define STACKSIZE 100
#define INT 1
#define FLOAT 2
#define CHAR 3
struct stackelement{
int etype;
union {
int ival;
float fval;
char cval;
} element;
};
struct stack{
int top;
struct stackelement items[STACKSIZE];
};
Run Code Online (Sandbox Code Playgroud)
使用此定义如何声明具有特定类型的堆栈,以及如何实现推送和弹出操作?
在这种简单的情况下,您可以使用一些宏魔法来伪造模板。例如,您可以将其放入文件中poly_stack.h
/* No include guards here! */\n\n#define CONCAT_NAME_R(A, B, C) A ## B ## C\n#define CONCAT_NAME(A, T) CONCAT_NAME_R(A, _, T)\n\nstruct CONCAT_NAME(stack, VALUE_TYPE)\n{\n VALUE_TYPE top;\n VALUE_TYPE items[STACKSIZE];\n};\nRun Code Online (Sandbox Code Playgroud)\n\n然后使用
\n\n#define VALUE_TYPE int\n#include poly_stack.h\n#undef VALUE_TYPE\nRun Code Online (Sandbox Code Playgroud)\n\n为了使其工作,您需要定义所有堆栈操作inline在头文件中定义所有堆栈操作。
我不认为这是一个非常优雅的解决方案。当然,您始终可以使用以下工具来生成外部代码sed:awk出于相同目的的工具来生成外部代码。
最后,您可以使用运行时多态性并声明
\n\nstruct poly_stack\n{\n void * top;\n void * items[STACKSIZE];\n};\nRun Code Online (Sandbox Code Playgroud)\n\n但与 \xe2\x80\x9ctemplated\xe2\x80\x9d 解决方案相比,这在类型安全性和性能方面都较差。而且使用起来也不太方便。
\n