主题:[原创]难看的C风格模版函数和模版类「宏实现」
[color=006000]#include <string>
#include <iostream>
[/color]
[color=006000]#include <cassert>
[/color][color=0000FF]using[/color] [color=0000FF]namespace[/color] std[color=a46434];[/color]
[color=006080]// C风格的“函数模版”
[/color][color=006000]#define print(type) \
void print_##type(type value) {\
cout << (type(value) + '1') << endl;\
}
[/color]
[color=006080]//类似,max的c风格模版函数可以写为:
[/color][color=006000]#define max(type) \
type max_##type(type v1, type v2) {\
return (v1 > v2) ? v1 : v2;\
}
[/color]
[color=006080]//类似,c风格模版类stack可以写为:
[/color][color=006000]#define c_stack(type, len) \
typedef struct stack_##type {\
type data[len];\
int capacity;\
int top;\
}stack_##type;\
void ini_stack_##type(stack_##type * t, int l) {\
t->capacity = l;\
t->top = 0;\
}\
void push_##type(stack_##type * t, type v) {\
assert(t->top < t->capacity);\
t->data[t->top++] = v;\
}\
type pop_##type(stack_##type * t) {\
return t->data[--t->top];\
}
[/color]
[color=006000]#define get_stack(name, type, len) \
stack_##type name;\
ini_stack_##type(&name, len)
[/color]
[color=006080]// 函数“实例化”
[/color]print[color=a46434]([/color]string[color=a46434])[/color]
print[color=a46434]([/color][color=0000FF]int[/color][color=a46434])[/color]
max[color=a46434]([/color][color=0000FF]int[/color][color=a46434])[/color]
[color=006080]// 模版类“实例化”
[/color]c_stack[color=a46434]([/color][color=0000FF]int[/color][color=a46434],[/color] [color=800080]10[/color][color=a46434])[/color]
[color=0000FF]int[/color] main[color=a46434]()[/color] [color=a46434]{[/color]
print_string[color=a46434]([/color]string[color=a46434]([/color][color=cc0000]"i work"[/color][color=a46434]));[/color]
print_int[color=a46434]([/color][color=800080]3[/color][color=a46434]);[/color]
cout [color=a46434]<<[/color] max_int[color=a46434]([/color][color=800080]3[/color][color=a46434],[/color] [color=800080]2[/color][color=a46434])[/color] [color=a46434]<<[/color] endl[color=a46434];[/color]
get_stack[color=a46434]([/color]is[color=a46434],[/color] [color=0000FF]int[/color][color=a46434],[/color] [color=800080]10[/color][color=a46434]);[/color]
[color=0000FF]for[/color] [color=a46434]([/color][color=0000FF]int[/color] i [color=a46434]=[/color] [color=800080]0[/color][color=a46434];[/color] i [color=a46434]<[/color] [color=800080]10[/color][color=a46434];[/color] i[color=a46434]++)[/color] [color=a46434]{[/color]
push_int[color=a46434](&[/color]is[color=a46434],[/color] i[color=a46434]);[/color]
[color=a46434]}[/color]
[color=0000FF]for[/color] [color=a46434]([/color][color=0000FF]int[/color] i [color=a46434]=[/color] [color=800080]0[/color][color=a46434];[/color] i [color=a46434]<[/color] [color=800080]10[/color][color=a46434];[/color] i[color=a46434]++)[/color] [color=a46434]{[/color]
cout [color=a46434]<<[/color] pop_int[color=a46434](&[/color]is[color=a46434])[/color] [color=a46434]<<[/color] endl[color=a46434];[/color]
[color=a46434]}[/color]
[color=a46434]}[/color]
#include <iostream>
[/color]
[color=006000]#include <cassert>
[/color][color=0000FF]using[/color] [color=0000FF]namespace[/color] std[color=a46434];[/color]
[color=006080]// C风格的“函数模版”
[/color][color=006000]#define print(type) \
void print_##type(type value) {\
cout << (type(value) + '1') << endl;\
}
[/color]
[color=006080]//类似,max的c风格模版函数可以写为:
[/color][color=006000]#define max(type) \
type max_##type(type v1, type v2) {\
return (v1 > v2) ? v1 : v2;\
}
[/color]
[color=006080]//类似,c风格模版类stack可以写为:
[/color][color=006000]#define c_stack(type, len) \
typedef struct stack_##type {\
type data[len];\
int capacity;\
int top;\
}stack_##type;\
void ini_stack_##type(stack_##type * t, int l) {\
t->capacity = l;\
t->top = 0;\
}\
void push_##type(stack_##type * t, type v) {\
assert(t->top < t->capacity);\
t->data[t->top++] = v;\
}\
type pop_##type(stack_##type * t) {\
return t->data[--t->top];\
}
[/color]
[color=006000]#define get_stack(name, type, len) \
stack_##type name;\
ini_stack_##type(&name, len)
[/color]
[color=006080]// 函数“实例化”
[/color]print[color=a46434]([/color]string[color=a46434])[/color]
print[color=a46434]([/color][color=0000FF]int[/color][color=a46434])[/color]
max[color=a46434]([/color][color=0000FF]int[/color][color=a46434])[/color]
[color=006080]// 模版类“实例化”
[/color]c_stack[color=a46434]([/color][color=0000FF]int[/color][color=a46434],[/color] [color=800080]10[/color][color=a46434])[/color]
[color=0000FF]int[/color] main[color=a46434]()[/color] [color=a46434]{[/color]
print_string[color=a46434]([/color]string[color=a46434]([/color][color=cc0000]"i work"[/color][color=a46434]));[/color]
print_int[color=a46434]([/color][color=800080]3[/color][color=a46434]);[/color]
cout [color=a46434]<<[/color] max_int[color=a46434]([/color][color=800080]3[/color][color=a46434],[/color] [color=800080]2[/color][color=a46434])[/color] [color=a46434]<<[/color] endl[color=a46434];[/color]
get_stack[color=a46434]([/color]is[color=a46434],[/color] [color=0000FF]int[/color][color=a46434],[/color] [color=800080]10[/color][color=a46434]);[/color]
[color=0000FF]for[/color] [color=a46434]([/color][color=0000FF]int[/color] i [color=a46434]=[/color] [color=800080]0[/color][color=a46434];[/color] i [color=a46434]<[/color] [color=800080]10[/color][color=a46434];[/color] i[color=a46434]++)[/color] [color=a46434]{[/color]
push_int[color=a46434](&[/color]is[color=a46434],[/color] i[color=a46434]);[/color]
[color=a46434]}[/color]
[color=0000FF]for[/color] [color=a46434]([/color][color=0000FF]int[/color] i [color=a46434]=[/color] [color=800080]0[/color][color=a46434];[/color] i [color=a46434]<[/color] [color=800080]10[/color][color=a46434];[/color] i[color=a46434]++)[/color] [color=a46434]{[/color]
cout [color=a46434]<<[/color] pop_int[color=a46434](&[/color]is[color=a46434])[/color] [color=a46434]<<[/color] endl[color=a46434];[/color]
[color=a46434]}[/color]
[color=a46434]}[/color]