栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++通过宏实现反射

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++通过宏实现反射

#include 
#include 
#include 

#define CLASS MyClass
#define CLASS_MAP ClassMap::get_class_map()
#define DEFINE_CLASS(class_type, class_name) 
	class_type(std::string) { 
		CLASS_MAP.regist_class(#class_name, class_type::class_name); 
	} 
	class_type() {} 
	static class_type self; 
	static CLASS* class_name() { 
		return new class_type(); 
	}
#define REGIST_CLASS(class_type) 
	class_type class_type::self(#class_type);

template 
class ClassMap {
	typedef T* (*ClassType)();
public:
	static ClassMap& get_class_map() {
		static ClassMap class_map;
		return class_map;
	}
private:
	std::map class_map;
public:
	void regist_class(const std::string class_name, const ClassType class_type) {
		this->class_map.insert(std::map::value_type(class_name, class_type));
	}
	T* get_class(const std::string class_name) {
		std::map::ClassType>::template iterator it = this->class_map.find(class_name);
		return (it != this->class_map.end()) ? it->second(): nullptr;
	}
};

class MyClass {
public:
	DEFINE_CLASS(MyClass, my_class)

public:
	virtual void xxx() const {
		std::cout << "xxx" << std::endl;
	}
};

REGIST_CLASS(MyClass)



int main() {
	MyClass* a = CLASS_MAP.get_class("my_class");
	if (a) {
		a->xxx();
	}
	else {
		std::cout << "my_class 未发现!" << std::endl;
	}
	
	MyClass* b = CLASS_MAP.get_class("undefined_class");
	if (b) {
		b->xxx();
	}
	else {
		std::cout << "undefined_class 未发现!" << std::endl;
	}

	return 0;
}

运行结果:

xxx
undefined_class 未发现!
暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号