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获取类构造函数指针,从而构造对象

  • 相关阅读:
    array常用方法总结
    .babelrc参数小解
    async/await方法解析
    html5-entities.js消失问题
    h => h(App)解析
    package.json字段简要解析
    body-parser小解
    mongodb中的__v字段
    module.exports与exports
    freemarker判断对象是否为空
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11978497.html
Copyright © 2011-2022 走看看