`

c++利用属性名设置和获取属性值

阅读更多

/*

 * @Filename:CMetaDataManager.h

 * @Date:2016-10-21

 * @Author:yuanzuochao

 * @Description:

 *  

 * @History:

 * Date                     Author                  Records

 * 2016-10-21               yuanzuochao             Create

 */

#ifndef CMETADATAMANAGER_H

#define CMETADATAMANAGER_H

 

#include <iostream>

 

using namespace std;

 

#include <string>

#include <vector>

#include <typeinfo>

#include <map>

struct IInfo

{

    virtual std::string getType() const = 0;

 

    virtual std::string getName() const = 0;

 

    virtual ~IInfo(){}

};

template<class _Class, class _Type> class CField;

 

template<class _Class, class _Type>

struct ISetter

{

    virtual void accecpt(CField<_Class, _Type>* field, _Class* ins, _Type value) = 0;

 

    virtual ~ISetter(){}

};

template<class _Class, class _Type>

struct IGetter

{

    virtual _Type accecpt(const CField<_Class, _Type>* field, _Class* ins) const = 0;

 

    virtual ~IGetter(){}

};

template<class _Class, class _Type>

class const_ref_param_setter:public ISetter<_Class, _Type>

{

public:

    typedef void (_Class::*Setter) (const _Type&);

public:

    const_ref_param_setter(Setter setter):

        m_pSetter(setter)

    {

 

    }

 

    void set(_Class* ins, _Type value)

    {

        (ins->*m_pSetter)(value);

    }

 

    void accecpt(CField<_Class, _Type>* field, _Class* ins, _Type value)

    {

        field->set(this, ins, value);

    }

private:

    Setter                  m_pSetter;

};

template<class _Class, class _Type>

class ordinary_setter:public ISetter<_Class, _Type>

{

public:

    typedef void (_Class::*Setter) (_Type);

public:

    ordinary_setter(Setter setter):

        m_pSetter(setter)

    {

 

    }

 

    void set(_Class* ins, _Type value)

    {

        (ins->*m_pSetter)(value);

    }

 

    void accecpt(CField<_Class, _Type>* field, _Class* ins, _Type value)

    {

        field->set(this, ins, value);

    }

private:

    Setter                  m_pSetter;

};

 

template<class _Class, class _Type>

class const_ref_ret_getter:public IGetter<_Class, _Type>

{

public:

    typedef const _Type& (_Class::*Getter) () const;

public:

    const_ref_ret_getter(Getter getter):

        m_pGetter(getter)

    {

 

    }

 

    const _Type& get(_Class* ins) const

    {

        return (ins->*m_pGetter)();

    }

 

    _Type accecpt(const CField<_Class, _Type>* field, _Class* ins) const 

    {

        return field->get(this, ins);

    }

private:

    Getter                  m_pGetter;

};

 

template<class _Class, class _Type>

class ordinary_getter:public IGetter<_Class, _Type>

{

public:

    typedef _Type (_Class::*Getter) () const;

public:

    ordinary_getter(Getter getter):

        m_pGetter(getter)

    {

 

    }

 

    _Type get(_Class* ins) const 

    {

        return (ins->*m_pGetter)();

    }

 

    _Type accecpt(const CField<_Class, _Type>* field, _Class* ins) const

    {

        return field->get(this, ins);

    }

private:

    Getter                  m_pGetter;

};

 

 

template<class _Class, class _Type>

class CField:public IInfo

{

public:

    typedef _Type _Class::* FieldType;

    typedef typename const_ref_param_setter<_Class, _Type>::Setter type_const_ref_param_setter;

    typedef typename ordinary_setter<_Class, _Type>::Setter type_ordinary_setter;

    typedef typename const_ref_ret_getter<_Class, _Type>::Getter type_const_ref_ret_getter;

    typedef typename ordinary_getter<_Class, _Type>::Getter type_ordinary_getter;

public:

    CField(std::string name,  type_const_ref_param_setter setter, type_const_ref_ret_getter getter):

        m_pField(NULL),

        m_strName(name)

    {

        m_pSetter = new const_ref_param_setter<_Class,_Type>(setter);

 

        m_pGetter = new const_ref_ret_getter<_Class, _Type>(getter);

    }

 

    CField(std::string name,  type_ordinary_setter setter, type_ordinary_getter getter):

        m_pField(NULL),

        m_strName(name)

    {

        m_pSetter = new ordinary_setter<_Class,_Type>(setter);

 

        m_pGetter = new ordinary_getter<_Class, _Type>(getter);

    }

 

    CField(std::string name, FieldType field):

        m_pField(field),

        m_strName(name),

        m_pSetter(NULL),

        m_pGetter(NULL)

    {

 

    }

 

    ~CField()

    {

        if(m_pGetter)

        {

            delete m_pGetter;

 

            m_pGetter = NULL;

        }

 

        if(m_pSetter)

        {

            delete m_pSetter;

 

            m_pSetter = NULL;

        }

    }

    std::string getType() const

    {

        return typeid(_Type).name();

    }

 

    std::string getName() const

    {

        return m_strName;

    }

 

    void set(_Class* ins, _Type value)

    {

        if(m_pField)

        {

            ins->*m_pField = value;

        }else if(m_pSetter)

        {

            m_pSetter->accecpt(this, ins, value);

        }else

        {

            std::cout<<"no setter matched!"<<std::endl;

        }

    }

 

    _Type get(_Class* ins) const

    {

        _Type value;

 

        if(m_pField)

        {

            value = ins->*m_pField;

        }else if(m_pGetter)

        {

            value = m_pGetter->accecpt(this, ins);

        }else

        {

            std::cout<<"no getter matched!"<<std::endl;

        }

        return value;

    }

 

    void set(const_ref_param_setter<_Class, _Type>* setter, _Class* ins, _Type value)

    {

        setter->set(ins, value);

    }

 

    _Type get(const const_ref_ret_getter<_Class, _Type>* getter, _Class* ins) const

    {

        return getter->get(ins);

    }

 

    void set(ordinary_setter<_Class, _Type>* setter, _Class* ins, _Type value)

    {

        setter->set(ins, value);

    }

 

    _Type get(const ordinary_getter<_Class, _Type>* getter, _Class* ins) const

    {

        return getter->get(ins);

    }

private:

    FieldType                              m_pField;

 

    std::string                            m_strName;

 

    ISetter<_Class, _Type>*                m_pSetter;

 

    IGetter<_Class, _Type>*                m_pGetter;

};

 

template <class _Class>

class CClass:public IInfo

{

    typedef std::map<std::string, IInfo*>::value_type type_map;

    typedef std::map<std::string, IInfo*>::iterator type_iter;

    typedef std::map<std::string, IInfo*>::const_iterator type_const_iter;

public:

    ~CClass()

    {

        type_iter iter = m_mapFieldInfo.begin();

 

        for(; iter != m_mapFieldInfo.end(); ++iter)

        {

            delete (iter->second);

        }

 

        m_mapFieldInfo.clear();

    }

    std::string getType() const

    {

        return typeid(_Class).name();

    }

 

    std::string getName() const

    {

        return typeid(_Class).name();

    }

public:

    //typedef typename CField<_Class, _Type>::type_const_ref_param_setter type_const_ref_param_setter;

    //typedef typename CField<_Class, _Type>::type_const_ref_ret_getter type_const_ref_ret_getter;

    template<class _Type>

    void addField(std::string name, void (_Class::*setter)(const _Type&),  const _Type& (_Class::*getter)() const )

    {

        IInfo* pField = new CField<_Class, _Type>(name, setter, getter);

 

        m_mapFieldInfo.insert(type_map(name, pField));

    }

 

    template<class _Type>

    void addField(std::string name, void (_Class::*setter)(_Type),   _Type (_Class::*getter)() const)

    {

        IInfo* pField = new CField<_Class, _Type>(name, setter, getter);

 

        m_mapFieldInfo.insert(type_map(name, pField));

    }

 

    template<class _Type>

    void addField(std::string name, _Type (_Class::*director))

    {

        IInfo* pField = new CField<_Class, _Type>(name, director);

 

        m_mapFieldInfo.insert(type_map(name, pField));

    }

 

    template<class _Type>

    void set(std::string name, _Class* ins, _Type value) const

    {

        type_const_iter iter = m_mapFieldInfo.find(name);

 

        if(iter == m_mapFieldInfo.end())

        {

            return;

        }

 

        CField<_Class, _Type>* pField = dynamic_cast<CField<_Class, _Type>*>(iter->second);

 

        if(NULL == pField)

        {

            return;

        }

 

        pField->set(ins, value);

    }

 

    template<class _Type>

    _Type get(std::string name, _Class* ins) const

    {

        _Type value;

        type_const_iter iter = m_mapFieldInfo.find(name);

 

        do

        {

            if(iter == m_mapFieldInfo.end())

            {

                std::cout<<"name: "<<name<<" not be found"<<std::endl;

                break;

            }

 

            CField<_Class, _Type>* pField = dynamic_cast<CField<_Class, _Type>*>(iter->second);

 

            if(NULL == pField)

            {

                std::cout<<"dynamic_cast failed"<<std::endl;

                break;

            }

 

            value = pField->get(ins);

        }while(0);

        return value;

    }

    std::string getFieldType(std::string name) const

    {

        std::string type;

        type_const_iter iter = m_mapFieldInfo.find(name);

 

        if(iter == m_mapFieldInfo.end())

        {

            std::cout<<"name: "<<name<<" not be found"<<std::endl;

            return type;

        }

 

        type = (iter->second)->getType();

 

        return type;

    }

private:

    std::map<std::string, IInfo*>                m_mapFieldInfo;

};

 

class CMetaDataManager

{

    typedef std::map<std::string, IInfo*>::value_type type_map;

    typedef std::map<std::string, IInfo*>::iterator type_iter;

    typedef std::map<std::string, IInfo*>::const_iterator type_const_iter;

public:

    template<class _Class>

    void registry()

    {

        IInfo* pClass = new CClass<_Class>();

 

        m_mapClassInfo.insert(type_map(typeid(_Class).name(), pClass));

    }

    template<class _Class, class _Type>

    void addField(std::string name, void (_Class::*setter)(const _Type&),  const _Type& (_Class::*getter)() const )

    {

        type_iter iter = m_mapClassInfo.find(typeid(_Class).name());

 

        if(iter == m_mapClassInfo.end())

        {

            return;

        }

 

        CClass<_Class>* pClass = dynamic_cast<CClass<_Class>*>(iter->second);

 

        if(NULL == pClass)

        {

            return;

        }

 

        pClass->addField(name, setter, getter);

    }

 

    template<class _Class, class _Type>

    void addField(std::string name, void (_Class::*setter)(_Type),   _Type (_Class::*getter)() const)

    {

        type_iter iter = m_mapClassInfo.find(typeid(_Class).name());

 

        if(iter == m_mapClassInfo.end())

        {

            return;

        }

 

        CClass<_Class>* pClass = dynamic_cast<CClass<_Class>*>(iter->second);

 

        if(NULL == pClass)

        {

            return;

        }

 

        pClass->addField(name, setter, getter);

    }

 

    template<class _Class, class _Type>

    void addField(std::string name, _Type (_Class::*director))

    {

        type_iter iter = m_mapClassInfo.find(typeid(_Class).name());

 

        if(iter == m_mapClassInfo.end())

        {

            return;

        }

 

        CClass<_Class>* pClass = dynamic_cast<CClass<_Class>*>(iter->second);

 

        if(NULL == pClass)

        {

            return;

        }

 

        pClass->addField(name, director);

    }

 

    template<class _Class, class _Type>

    void set(std::string name, _Class* ins, _Type value) const

    {

        type_const_iter iter = m_mapClassInfo.find(typeid(_Class).name());

 

        if(iter == m_mapClassInfo.end())

        {

            return;

        }

 

        CClass<_Class>* pClass = dynamic_cast<CClass<_Class>*>(iter->second);

 

        if(NULL == pClass)

        {

            return;

        }

 

        pClass->set(name, ins, value);

    }

    template<class _Class, class _Type>

    _Type get(std::string name, _Class* ins) const

    {

        _Type value;

 

        type_const_iter iter = m_mapClassInfo.find(typeid(_Class).name());

 

        do

        {

            if(iter == m_mapClassInfo.end())

            {

                break;

            }

 

            CClass<_Class>* pClass = dynamic_cast<CClass<_Class>*>(iter->second);

 

            if(NULL == pClass)

            {

                break;

            }

 

            value = pClass->get<_Type>(name, ins);

        }while(0);

        return value ;

    }

 

    template<class _Class>

    std::string getFieldType(std::string name) const

    {

        std::string type="";

 

        type_const_iter iter = m_mapClassInfo.find(typeid(_Class).name());

 

        if(iter == m_mapClassInfo.end())

        {

            return type;

        }

 

        CClass<_Class>* pClass = dynamic_cast<CClass<_Class>*>(iter->second);

 

        if(NULL == pClass)

        {

            return type;

        }

 

        return pClass->getFieldType(name);

    }

private:

    std::map<std::string, IInfo*>           m_mapClassInfo;

};

 

#endif //CMETADATAMANAGER_H

分享到:
评论

相关推荐

    C++读写EXCEL,设置单元格和字体属性

    以libxl为例,以下是如何用它来读写单元格和设置字体: ```cpp #include using namespace libxl; int main() { Book* book = xlCreateBook(); // 创建新书 Sheet* sheet = book-&gt;addSheet("Sheet1"); // 添加新...

    C++BUILDER按钮设置c++

    在C++Builder中,按钮控件是用户界面中常见的元素,用于执行特定操作或触发事件。C++Builder提供了一个强大的可视...在实际编程过程中,记得经常查阅文档和利用C++Builder的内置帮助系统,以便获取更详细的信息和示例。

    Qt C++属性类型提供给 QML调用

    `READ`指定获取属性值的函数,`WRITE`指定设置属性值的函数,`NOTIFY`则指明当属性值改变时要发出的信号。 将C++类注册到QML引擎是另一个重要的步骤。这通常通过`qmlRegisterType`函数完成,这样QML就可以实例化并...

    VC++ 更改文件属性为只读系统或隐藏

    在VC++编程环境中,我们可以利用C++的标准库和Windows API函数来改变文件的属性,包括设置文件为只读、系统或隐藏。这篇文章将详细介绍如何实现这一功能。 首先,我们需要了解在Windows操作系统中,文件属性是由...

    C++builder2010利用OLE操作EXCEl

    4. **读写单元格**:通过`TExcelRange`对象,你可以访问和修改单元格的值,也可以设置单元格的格式,如字体、颜色、对齐方式等。 5. **公式和函数**:Excel的强项在于它的计算能力。你可以通过`TExcelRange`对象的...

    C++实时获取麦克风声音强度measure

    总结起来,这个项目利用C++和MFC技术,结合Windows Core Audio APIs实现了从麦克风实时获取声音强度的功能,并通过MFC界面展示结果。实现过程中涉及到了音频设备枚举、数据捕获、信号处理、多线程编程以及用户界面...

    Visual C++ 文件与文件夹属性操作

    要修改属性,可以使用`SetFileAttributes`函数,传入文件名和新的属性值。 在处理文件夹时,我们还需要关注递归操作,即遍历整个目录结构并对其下的所有文件和子文件夹执行相同的操作。这通常通过递归函数实现,...

    VC++调用IDispatch接口属性和方法的封装类

    //获取属性值 _bstr_t bstrValue=CVB::get(pDispatch,L\"Value\"); //设置属性值 CVB::put(pDispatch,L\"Value\",bstrValue); //调用方法 _bstr_t bstrMessage2=CVB::Invoke1( pDispatch, L"Echo", L"hello world!...

    C++ Builder XE 读写EXCEL表格内容与设置属性实例.zip

    在这个“C++ Builder XE 读写EXCEL表格内容与设置属性实例”中,我们将探讨如何利用C++ Builder XE与Microsoft Excel进行交互,读取和写入Excel表格数据,以及设置Excel的各种属性。 首先,要实现对Excel的读写操作...

    visual C++ 获取CPU 信息

    // 提取属性值,例如CPU ID, Manufacturer, CurrentClockSpeed variant_t varName, varValue; if (pclsObj-&gt;Get(L"ProcessorId", 0, &varName, 0, 0) == S_OK) // 处理ProcessorId if (pclsObj-&gt;Get(L...

    显示图像像素坐标和灰度值vs+c++

    在图像处理领域,显示图像像素坐标和灰度值是一项基础且重要的任务,它能帮助我们理解图像的基本属性和进行进一步的分析。在这个项目中,我们将使用C++编程语言,并结合Visual Studio (VS) IDE来实现这个功能。"灰度...

    QR分解求矩阵特征值特征向量 C语言.rar_ARQZ_aboardsiz_求特征向量_矩阵特征值_矩阵特征值 c++

    特征值和特征向量揭示了矩阵在几何变换上的本质属性,比如在向量空间中的缩放和旋转。 **利用QR分解求特征值和特征向量**的方法是这样的:首先对矩阵A进行QR分解,然后对R进行幂迭代或反幂迭代。因为R是对角占优的...

    利用C++读取XML文件

    下面将详细介绍如何利用C++和TinyXML库来读取XML文件。 1. **TinyXML库介绍** TinyXML库提供了一种简洁的方式来解析XML文档,并将其转换为C++对象结构。它包括DOM(Document Object Model)解析器,允许开发者遍历...

    CATIA二次开发:C#方式获取产品属性:一般属性及自定义属性

    在CATIA中,自定义属性的获取和设置略有不同,需要特别注意的是,获取到的参数带有特征信息,因此需要进行分割处理。获取参数的名称通常是指参数最后一个反斜杠\后面的部分。 在实际操作中,可以通过访问Product...

    C++个人通讯录设计

    每个`Contact`对象代表一个联系人,类的成员函数则用于操作这些信息,如设置和获取属性值。通过封装这些数据和功能,我们实现了面向对象编程的基本原则。 其次,为了方便用户与系统交互,我们需要设计一个友好的...

    C++ MFC开发的设置字体软件

    本项目是利用C++ MFC进行字体设置软件的开发,适用于初学者进行毕业设计或课程设计,以了解和实践图形用户界面(GUI)编程。 首先,我们来详细探讨一下“字体设置”这个主题。在计算机应用中,字体设置涉及到文字的...

    C# 获取C++的连续数据

    在跨语言编程中,特别是在C#与C++的交互中,获取C++的连续数据是一项常见的任务。这两种语言由于设计上的差异,它们处理内存和数据的方式有所不同,这使得数据交换成为了一个挑战。以下是对这两种方法的详细解释: ...

    C++ DEM的读取与绘制

    - `fMinHeight` 和 `fMaxHeight` 定义了DEM中的最小和最大高程值。 ##### 文件体 文件体主要包含具体的高程数据,通常是以二维数组的形式存储的。这部分数据将用于地形的绘制。 #### 二、在场景中绘制DEM 接下来...

    用C++实现MapInfo 的mif文件读取(源码)

    每一行代表一个记录,可能包含几何定义、属性字段声明或属性值。对于几何定义,我们需识别其类型(如POINT、LINE、POLYGON),然后解析坐标值。例如,对于一个点记录,我们将找到两个浮点数表示X和Y坐标。对于线和...

Global site tag (gtag.js) - Google Analytics