码迷,mamicode.com
首页 > 编程语言 > 详细

C++笔记2 :“反射”初试水

时间:2014-06-05 16:35:45      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

像Java或者是很多脚本语言,由于有着 “不用编译成机器码,直接解释执行” 这种先天优势,实现反射机制简单的一B。。

再反观我大C++,又一次遇到了麻烦。。。

 

其实我的需求特别简单:就是利用字符串可以调用同名的函数而已。。。

说的清楚一点,就是传入参数 “hello”,可以调用 void hello() 这个函数。。。

 

C++编译后已经丢掉了函数名,不可能做到这个需求,而很多时候这个需求都是必须的,然后我就得到了下面两种大概可行的做法:

  1、写个map,key为字符串,value为函数指针。(和 switch case 有很大区别么。。。)

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

 

  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++笔记2 :“反射”初试水

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/wolfred7464/p/3768689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!