本文用C++ 模拟反射机制。
声明一个类时,用类名注册一个打印函数。
打印函数的签名有规则:参数是string, 返回值是void ,函数名时Print+类名。
#include <iostream>
#include <map>
#include <functional>
#include <memory>
#include <string>
#define FUNC std::function<void(std::string)>
class Reflector
{
private:
std::map<std::string, FUNC> _cmdStringMap;
static std::shared_ptr<Reflector> ptr;
public:
void GetPrintFunc(const std::string &str, std::string con)
{
for (auto & x : _cmdStringMap)
{
if (x.first == str)
x.second(con);
}
}
void Register(const std::string &class_name, FUNC && generator)
{
_cmdStringMap[class_name] = generator;
}
static std::shared_ptr<Reflector> Instance()
{
if (ptr == nullptr)
{
ptr.reset(new Reflector());
}
return ptr;
}
};
std::shared_ptr<Reflector> Reflector::ptr = nullptr;
class RegisterAction
{
public:
RegisterAction(const std::string &class_name, FUNC && generator)
{
Reflector::Instance()->Register(class_name, std::forward<FUNC>(generator));
}
};
#define REGISTER(CLASS_NAME) \
RegisterAction g_register_action_##CLASS_NAME(#CLASS_NAME, Print##CLASS_NAME);
应用实例
void PrintBase(std::string str)
{
std::cout << str << std::endl;
}
class Base
{
Base() {}
};
REGISTER(Base);
int main()
{
Reflector::Instance()->GetPrintFunc("Base", "April is a student.");
getchar();
}
运行结果