zoukankan      html  css  js  c++  java
  • C++实现反射机制

    C++中反射机制的实现
    简单理解:只根据类的名字(字符串)创建类的实例。
    事实:C++并没有直接从语言上提供反射机制给我们用,不过无所不能的C++可以通过一些trick来实现反射。
    好处:代码精简,提高易用性

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <iostream>
    #include <map>
    #include <memory>
    #include <functional>

    using FUNC = std::function<void *(void)>;

    using namespace std;

    class Reflector
    {
    private:
        map<std::string, FUNC>    objectMap;
        
    static shared_ptr<Reflector>  ptr;

    public:
        
    void *CreateObject(const string &str)
        {
            
    for (auto &x : objectMap)
            {
                
    if(x.first == str)
                    
    return x.second();
            }
            
    return nullptr;
        }

        
    void Register(const string &class_name, FUNC &&generator)
        {
            objectMap[class_name] = generator;
        }

        
    static shared_ptr<Reflector> Instance()
        {
            
    if(ptr == nullptr)
            {
                ptr.reset(
    new Reflector());
            }

            
    return ptr;
        }

    };

    shared_ptr<Reflector> Reflector::ptr = nullptr;

    class RegisterAction
    {
    public:
        RegisterAction(
    const string &class_name, FUNC &&generator)
        {
            Reflector::Instance()->Register(class_name, forward<FUNC>(generator));
        }
    };

    解读:只要注册好,啥都可以造!

    1、单例类
    2、对象映射表:key-类字符串,value-类无参构造函数指针
    3、提前调用Register注册
    4、调用CreateObject获取类构造函数指针,从而构造对象

  • 相关阅读:
    序列终结者
    CF696C PLEASE
    [清华集训]Rmq Problem / mex
    CF786B Legacy
    链表结构详解
    synchronized同步方法和同步代码块的区别
    关于守护线程定义
    线程的优先级
    mysql查询当天的数据
    java以正确的方式停止线程
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11978497.html
Copyright © 2011-2022 走看看