## C++反射
```cpp
#include <iostream>
#include <unordered_map>
#include <memory>
#include <functional>
class Reflector {
public:
typedef std::function<void*()> Func;
void* CreateObject(const std::string& name)
{
if (mapFunction_.count(name))
return mapFunction_[name]();
return nullptr;
}
void Regist(const std::string& name, Func&& func)
{
mapFunction_[name] = func;
}
static Reflector& Instance()
{
static Reflector instance;
return instance;
}
private:
Reflector() {}
std::unordered_map<std::string, Func> mapFunction_;
};
class Register {
public:
typedef std::function<void*()> Func;
Register(const std::string& name, Func&& func)
{
Reflector::Instance().Regist(name, std::forward<Func>(func));
}
};
#define REGISTER(class_name) \
Register g_register_##class_name(#class_name, []() { \
return new class_name(); \
});
class Base {
public:
explicit Base() = default;
virtual void Print()
{
std::cout << "Base" << std::endl;
}
};
REGISTER(Base);
class DeriveA : public Base {
public:
void Print() override
{
std::cout << "DeriveA" << std::endl;
}
};
REGISTER(DeriveA);
class DeriveB : public Base {
public:
void Print() override
{
std::cout << "DeriveB" << std::endl;
}
};
REGISTER(DeriveB);
#define BASE_CREATE(name) reinterpret_cast<Base*>(Reflector::Instance().CreateObject(name))
int main()
{
std::shared_ptr<Base> p1(BASE_CREATE("Base"));
p1->Print();
std::shared_ptr<Base> p2(BASE_CREATE("DeriveA"));
p2->Print();
std::shared_ptr<Base> p3(BASE_CREATE("DeriveB"));
p3->Print();
return 0;
}
```
结果:
```
Base
DeriveA
DeriveB
```
## 可变参数C++反射
```cpp
/**
* @brief C++反射
* @detail 仅支持自定义类型,而且该类型需继承DynamicCreator
*/
#include <string>
#include <iostream>
#include <typeinfo>
#include <memory>
#include <unordered_map>
#include <cxxabi.h>
#include <functional>
namespace neb {
class Base {
public:
Base() {}
virtual ~Base() {}
virtual void Say()
{
std::cout << "Base" << std::endl;
}
};
template <typename... Args>
class DynamicFactory {
public:
static DynamicFactory& Instance()
{
static DynamicFactory instance;
return instance;
}
bool Regist(const std::string& name, std::function<Base*(Args&&... args)> func)
{
if (func == nullptr)
return false;
return mapFunction_.insert(std::make_pair(name, func)).second;
}
Base* Create(const std::string& name, Args&&... args)
{
auto iter = mapFunction_.find(name);
if (iter == mapFunction_.end())
return nullptr;
else
return iter->second(std::forward<Args>(args)...);
}
private:
DynamicFactory() {}
std::unordered_map<std::string, std::function<Base*(Args&&...)>> mapFunction_;
};
template <typename T, typename... Args>
class DynamicCreator {
public:
struct Register {
Register()
{
char* pDemangleName = nullptr;
std::string name;
pDemangleName = abi::__cxa_demangle(typeid(T).name(), nullptr, nullptr, nullptr);
if (pDemangleName != nullptr)
{
name = pDemangleName;
free(pDemangleName);
}
DynamicFactory<Args...>::Instance().Regist(name, CreateObject);
}
inline void do_nothing() const {};
};
DynamicCreator() { register_.do_nothing(); }
virtual ~DynamicCreator() {};
static T* CreateObject(Args&&... args) { return new T(std::forward<Args>(args)...); }
static Register register_;
};
template <typename T, typename... Args>
typename DynamicCreator<T, Args...>::Register DynamicCreator<T, Args...>::register_;
class Cmd : public Base, public DynamicCreator<Cmd> {
public:
Cmd() { std::cout << "Create Cmd " << std::endl; }
virtual void Say() override
{
std::cout << "I am Cmd" << std::endl;
}
};
class Step : public Base, public DynamicCreator<Step, std::string, int> {
public:
Step(const std::string &strType, int iSeq) { std::cout << "Create Step " << strType << " with seq " << iSeq << std::endl; }
virtual void Say() override
{
std::cout << "I am Step" << std::endl;
}
};
class Reflector {
public:
template <typename... Args>
static std::shared_ptr<Base> Create(const std::string &name, Args &&... args)
{
std::shared_ptr<Base> ptr(DynamicFactory<Args...>::Instance().Create(name, std::forward<Args>(args)...));
return ptr;
}
};
}
int main(int argc, char** argv)
{
std::shared_ptr<neb::Base> p1 = neb::Reflector::Create("neb::Cmd");
p1->Say();
std::cout << "----------------------------------------------------------------------" << std::endl;
std::shared_ptr<neb::Base> p2 = neb::Reflector::Create("neb::Step", std::string("neb::Step"), 1002);
p2->Say();
return 0;
}
```
结果:
```
Create Cmd
I am Cmd
----------------------------------------------------------------------
Create Step neb::Step with seq 1002
I am Step
```
- 空白目录
- 算法
- 排序
- 冒泡排序
- 选择排序
- 插入排序
- 归并排序
- 快速排序
- 计数排序
- 桶排序
- 基数排序
- 希尔排序
- 堆排序
- 二分查找
- 最小堆
- 最小索引堆
- 平衡二叉树(AVL tree)
- bitmap位图
- 布隆过滤器
- hashmap
- topK
- 跳表
- LRU Cache
- kmp
- 最小堆和堆排序
- 最短路径
- C++
- 运行时类型判断RTTI
- C++反射
- 手动实现智能指针
- 序列化实现
- rpc实现
- std::forward
- 函数指针的妙用
- C/C++
- std::function
- 同步队列
- 线程池实现
- std::promise
- 深入理解虚函数
- extern "C" 关键字讲解
- 大端小端的区别
- 简历
- 简历1
- redis
- 数据结构和对象
- sds
- list
- zskiplist
- 腾讯云redis面试题总结
- redis集群部署
- LeetCode
- 目标
- go基础
- 算法快速入门
- 数据结构篇
- 二叉树
- 链表
- 栈和队列
- 二进制
- 基础算法篇
- 二分搜索
- 排序算法
- 动态规划
- 算法思维
- 递归思维
- 滑动窗口思想
- 二叉搜索树
- 回溯法
- 其他
- 剑指offer
- 笔记
- git代理加速
- Linux
- vim大法
- vscode远程不能跳转
- cmake
- 设计模式
- 单例模式
- 简单工厂模式
- 外观模式
- 适配器模式
- 工厂方法模式
- 抽象工厂模式
- 生成器模式
- 原型模式
- 中介者模式
- 观察者模式
- 访问者模式
- 命令模式
- 网络编程
- epoll reactor模式
- linux timerfd系列函数总结
- IO
- mapreduce
- 反射器
- leo通信库
- Mutex
- Condition
- thread
- raft
- 协程
- hook
- 定时器
- 别人的面试经验
- 面试题
- vector崩溃问题
- JAVA
- Linux java环境配置
- ucore
- lab1
- FreeNOS
- leveldb
- 刷题笔记
- 回文串
- 前缀树
- 字符串查找
- 查找两个字符串a,b中的最长公共子串
- 动态规划
- golang
- 顺序循环打印实现
- 数据结构
- rpc运用
- python
- 单例
- 深拷贝浅拷贝
- 链表
- python基础题
- mysql
- 事务
- Linux
- 共享内存
- 刷题记录
- 贪心算法
- 动态规划
- 面试
- 腾讯C++面试
- 微众面试JD
- 迅雷网络面试
- 学习网址
- rabbitMq
