发新话题
打印

[原创]用C部分实现C++下的类模板

[原创]用C部分实现C++下的类模板

文章作者:门外汉
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

去年暑假忙啊,一边是C,一边是C++,中间是数据结构,以至于学数构时无意识的将C和C++也混在一块了,例如C++的模板类,那可是好东西啊,多方便,就时常想着C为什么就不弄个template,呵呵.
在struct里面整个typedef 换类型,换来换去的,太不好了,于是乎,我就做了下面的东东.

就是这么简单,它就是C里面的预处理器运算符##.
引自<<TCPL>>里面的话:预处理器运算符##为宏扩展提供了一种连接实际参数的手段.如果替换文本中的参数与##相邻,则该参数将被实际参数替换......
替换~template很大一部分做的工作不也就是替换么.
复制内容到剪贴板
代码:
#define  foo(name)  bar##name
如此调用foo(a)时,则宏扩展为bara

上面一段似乎没说明什么问题,那么就看下面这段吧:
复制内容到剪贴板
代码:
#ifndef STACK_H
#define STACK_H

#ifndef MY_BOOL
#define MY_BOOL
#define TRUE 1
#define FALSE 0
typedef int BOOL;
#endif

/*栈类型栈结点结构*/
#define DEFINE_STACK_NODE(type,name) \
typedef struct name##STACK_NODE{\
type data;\
struct name##STACK_NODE *prior;\
}name##STACK_NODE;

/*泛类型栈定义*/
#define DEFINE_STACK(type,name) \
DEFINE_STACK_NODE(type,name)\
struct name##STACK{\
int size;\
struct name##STACK_NODE *base;\
struct name##STACK_NODE *top;\
}name##STACK

#define INIT_STACK(name)\
do{\
name##STACK.base=name##STACK.top=(void *)0;\
name##STACK.size=0;\
}while(0)

/*********** 不破坏栈顶元素取值*************************/
#define GET_STACK(name,elem) do{\
if(name##STACK.size){\
*elem=name##STACK.top->data;\
}\
}while(0)

/************** 压入元素elem **************************/
#define PUSH_STACK(name,elem) do{\
name##STACK_NODE *temp=(name##STACK_NODE *)malloc(sizeof(name##STACK_NODE));\
temp->data=elem;\
++(name##STACK.size);\
if(1!=name##STACK.size){\
temp->prior=name##STACK.top;\
name##STACK.top=temp;\
}\
else{\
temp->prior=(void *)0;\
name##STACK.top=name##STACK.base=temp;\
}\
}while(0)

/********** 栈顶元素赋值给elem,并弹出 ***********/
#define POP_STACK(name,elem) do{\
name##STACK_NODE *temp=name##STACK.top;\
if(name##STACK.size){\
*elem =name##STACK.top->data;\
if(1!=name##STACK.size--){\
name##STACK.top =temp->prior;\
}\
else{\
name##STACK.top=name##STACK.base=(void *)0;\
}\
free(temp);\
}\
}while(0)

/************** 清空栈 ************************/
#define CLEAR_STACK(name) do{\
for(;name##STACK.size;--name##STACK.size){\
name##STACK_NODE *temp=name##STACK.top;\
name##STACK.top=name##STACK.top->prior;\
free(temp);\
}\
name##STACK.base=name##STACK.top=(void *)0;\
}while(0)

/****************栈空???? ************************/
#define EMPTY_STACK(name) (!name##STACK.size)?(TRUE):(FALSE)

/*****************长度 ************************/
#define LENGTH_STACK(name) (1?name##STACK.size:0)

#endif
文件保存为:my_stack.h

再接着一段测试的代码:
复制内容到剪贴板
代码:
#include <stdio.h>
#include "my_stack.h"

DEFINE_STACK(int,A);
int main(void)
{
  DEFINE_STACK(double,B);
  
  int a;
  double b;
  
  INIT_STACK(A);
  INIT_STACK(B);
  printf("%d ",LENGTH_STACK(A));

  for(a=1;a<=100;a++){
    PUSH_STACK(A,a);
    PUSH_STACK(A,a);
    PUSH_STACK(A,a);
  }
  printf("%d ",LENGTH_STACK(A));

  for(a=1;a<=100;a++){
    PUSH_STACK(B,(double)a);
  }

  while( ! EMPTY_STACK(A)){
    POP_STACK(A,&a);
    if( ! EMPTY_STACK(B)){
      POP_STACK(B,&b);
    }
  }
  CLEAR_STACK(A);
  CLEAR_STACK(B);

  return 0;
}
大家是不是觉得我很无聊呢?嘿嘿 [s:45]
就算是脑筋急转弯吧.HOHO~

最后:老大们,我好仰慕你们哇,我想加入哇,这是我的投名状..小弟拜呈.

88大家.

TOP

我去年在csdn上自己的专栏里写过的,不过是纯代码了,以文章形式的,在这是首发 [s:35]

TOP

以前记得看到一篇用c部分实现类的文章
现在又有模板实现.现在C/C++高手越来越多了[s:51]

不过宏的致命缺点还是可能影响模板的实现
比如我在函数内直接使用运算公式就可能导致整个模板出错了
连入侵者都敢说自己在做网络安全。关键大家是真正为安全作过什么?

TOP

C++本身就是从带类的C演变过来,而带类的C的前身就是类似宏实现的一种C扩展……
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

但是毕竟宏代替不了模板 模板并不是T容器这么简单 比如宏不能递归 模板可以 于是就有了奇妙metatemplate

TOP

发新话题