标签:c style class blog code java
像Java或者是很多脚本语言,由于有着 “不用编译成机器码,直接解释执行” 这种先天优势,实现反射机制简单的一B。。
再反观我大C++,又一次遇到了麻烦。。。
其实我的需求特别简单:就是利用字符串可以调用同名的函数而已。。。
说的清楚一点,就是传入参数 “hello”,可以调用 void hello() 这个函数。。。
C++编译后已经丢掉了函数名,不可能做到这个需求,而很多时候这个需求都是必须的,然后我就得到了下面两种大概可行的做法:
1、写个map,key为字符串,value为函数指针。(和 switch case 有很大区别么。。。)
1 #include <stdio.h> 2 #include <map> 3 4 using namespace std; 5 6 void hello() 7 { 8 printf("hello!\n"); 9 } 10 11 int main() 12 { 13 typedef void (*FUNC)(void); 14 map<const char*, FUNC> funcMap; 15 funcMap.insert(pair<const char*, FUNC>("hello", hello)); 16 FUNC func = funcMap["hello"]; 17 func(); 18 return 0; 19 }
2、通过内嵌我大Lua,实现反射机制。
由于我的Lua水平还是初学者阶段,这个方法是否可行还不知道,我去研究研究,之后再补充结论。。
另外,在研究能否用宏来实现反射的时候,有两点值得记录一下:
1、##表示拼接,将多个token拼接成一个token。另外还可以在可变参数为0时消除逗号。
拼接示例: #define CALL_FUNC(funcName) call##funcName(),调用CALL_FUNC(hello),等价于调用函数callhello()
消除逗号示例: #define PRINT(format, ...) printf(format, ##__VA_ARGS__) ,调用PRINT(“Hello, World”),等价于printf(“Hello, World”);
2、#表示将代码字符化
#define TOSTRING(str) #str,我们调用 printf(TOSTRING(hello)),等价于printf("hello");
C++笔记2 :“反射”初试水,布布扣,bubuko.com
标签:c style class blog code java
原文地址:http://www.cnblogs.com/wolfred7464/p/3768689.html