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

像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

时间: 2024-12-15 07:23:13

C++笔记2 :“反射”初试水的相关文章

Android初试水

唯技术与能力让人心安 初试水,愿定期的更新博客,将Android开发中遇到的问题整理出来,以资激励自己前进的步伐.若有技术阐述之误,烦请众将海涵初登堂之菜鸟 ----承序猿

Java学习笔记之反射

鲁春利的工作笔记,谁说程序员不能有文艺范? Java程序在运行期间可以动态加载.解析和使用一些在编译阶段并不确定的类型,这一机制被称为反射(Reflection)或自省(Introspection).Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.这种"看透class"的能力(the ability of the program toexamine itself)被称为

笔记:反射

反射库提供了大量操作Java代码的工具集,以便编写能够通道操作Java代码的程序,能够分析类能力的程序称为反射(reflective). Class 类 在程序运行期间,Java运行时系统始终为所有的对象维护一个称为运行时的类型标识,这个信息跟踪着每个对象所属的类,虚拟机利用运行时类型信息选择相应的方法执行,可以通过专门的类来访问这些信息,保存这些信息的类被称为 Class,Object 类的getClass方法将返回一个Class类型的实例,示例代码如下: ??????public stati

python学习笔记-Day08--(反射)

从一开始学习这一块感觉blog就比较难写,本来就不太会写博客的问题就更严重了. 想不出什么形象的比喻.所以要写blog的时候我的心情是这样的,但是我的心情应该调整成这样的. 还是用上课时举的例子来说明白. 首先说明一下,反射要用到内置函数, getattr(obj,name)hasattr(obj,name)delattr(obj,name)  #操作内存,不影响文件,很少使用setattr(obj,name)  #操作内存,不影响文件,很少使用 先看一下getattr()方法的说明 getat

JDBC学习笔记——利用反射及JDBC元数据编写通用的查询方法

我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询. 在此之前我们是这样做的: 查询customers表中的字段以及字段值: 1 public Customer getCustomer(String sql, Object... args) { 2 Customer customer = null; 3 Connection connection = null; 4 Prepared

JavaSE 学习笔记之反射技术(二十四)

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

Java学习笔记之反射(Reflection)

什么是反射 能够分析类能力的程序称为反射(reflection) 反射可以用来干什么 Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息. - 在运行中分析类的能力 - 在运行中查看对象 - 实现通用的数组操作代码 - 利用Method对象 Class类 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着这个对象所属的类.可以通过专门的Java类访问这些信息,保存这些信息的类被

golang反射初试

golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST. t := reflect.TypeOf(obj) 使用TypeOf()获取类型信息. v := reflect.ValueOf(obj) 使用ValueOf获取值信息 如果t是Array, Slice, Map, Chan或Pointer,可以继续继续使用Elem()方法获取其元素的更多信息. Elem(): 必须是Array, Slice, Map, Chan或

笔记 .Net反射机制

.Net中反射机制, 一般常用的就是这两句: Type type=Assembly.Load("RoadFlow.Data."+dataType).GetType(typeName,ture); obj=Activator.CreateInstance(type); 我们常说的工厂模式,基本上就是使用反射机制来做的,通过类型字符串创建类型, 然后通过类型创建实例.