万能类型的设计
2015-05-19 00:00
330 查看
摘要: 在项目中,我们往往需要有一种类型,可以将各种既定的类型存储起来,实现多种类型的相同操作;配置文件的解析中应用最为普遍......
大量使用C语言的宏,省去了非常多的麻烦,在头文件文件的最前面可以注册各种类型,
/** 万能类型 AnyType.h **/ #include <string> #define AnyType_FOREACH_TYPES(Operator) \ AnyType_FOREACH_TYPES3(Operator, int, double, bool) #define AnyType_FOREACH_TYPES3(Operator, Type1, Type2, Type3) \ AnyType_FOREACH_TYPES2(Operator, Type2, Type3)\ AnyType_FOREACH_TYPES1(Operator, Type1) #define AnyType_FOREACH_TYPES2(Operator, Type1, Type2) \ AnyType_FOREACH_TYPES1(Operator, Type2)\ AnyType_FOREACH_TYPES1(Operator, Type1) #define AnyType_FOREACH_TYPES1(Operator, Type) \ Operator(Type) static void AnyType_throw(std::string exception) { throw exception; } #define AnyType_THROW(exception) AnyType_throw(exception); class DllClass CAnyType { public: //定义枚举 #define AnyType_DEFINE_ENUM_TYPE(Type) Type ## Enum #define AnyType_DEFINE_TYPE_ENUMS(Type) AnyType_DEFINE_ENUM_TYPE(Type), enum AnyTypeEnum { AnyType_FOREACH_TYPES(AnyType_DEFINE_TYPE_ENUMS) AnyTypeEnumBuffer }; public: CAnyType(void); CAnyType(const CAnyType& other); ~CAnyType(void); //定义构造 #define AnyType_DEFINE_CONSTRUCTOR(Type) \ CAnyType(Type value); #define AnyType_CREATE_CONSTRUCTOR(Type) \ CAnyType::CAnyType(Type value)\ {\ m_type = AnyType_DEFINE_ENUM_TYPE(Type);\ m_data = new Type(value);\ } AnyType_FOREACH_TYPES(AnyType_DEFINE_CONSTRUCTOR); //定义类型运算符 #define AnyType_DEFINE_TYPE_OPERATOR(Type) \ operator Type()const; #define AnyType_CREATE_TYPE_OPERATOR(Type) \ CAnyType::operator Type()const\ {\ if (m_type == AnyType_DEFINE_ENUM_TYPE(Type))\ {\ return *((Type*)m_data);\ }\ AnyType_THROW("类型不匹配");\ return Type();\ } AnyType_FOREACH_TYPES(AnyType_DEFINE_TYPE_OPERATOR); //定义赋值运算符 CAnyType& operator=(const CAnyType& other); #define AnyType_DEFINE_ASSIGNMENT(Type) \ CAnyType& operator =(const Type& other); #define AnyType_CREATE_ASSIGNMENT(Type) \ CAnyType& CAnyType::operator =(const Type& other)\ {\ *this = CAnyType(other);\ return *this;\ }; AnyType_FOREACH_TYPES(AnyType_DEFINE_ASSIGNMENT); //类型说明 std::string GetTypeString()const; CAnyType::AnyTypeEnum GetTypeEnum()const; private: void * m_data; AnyTypeEnum m_type; void ClearData(); };
/** 万能类型 AnyType.cpp **/ #include "AnyType.h" CAnyType::CAnyType(void) { m_type = /*CAnyType::AnyTypeEnum::*/AnyTypeEnumBuffer; m_data = 0; } CAnyType::CAnyType( const CAnyType& other ) { *this = other; } CAnyType& CAnyType::operator=( const CAnyType& other ) { if (m_type != other.m_type) { ClearData(); } #define AnyType_OPERATOR_DENGYU(Type) \ case AnyType_DEFINE_ENUM_TYPE(Type):\ if (m_type == other.m_type)\ {\ *((Type*)m_data) = *((Type*)(other.m_data));\ }\ else\ {\ m_data = new Type(*((Type*)(other.m_data)));\ }\ break; switch(other.m_type) { AnyType_FOREACH_TYPES(AnyType_OPERATOR_DENGYU); default: break; } m_type = other.m_type; return *this; } CAnyType::~CAnyType(void) { ClearData(); } std::string CAnyType::GetTypeString()const { std::string ret; #define AnyType_GETTYPESTRING(Type) \ case AnyType_DEFINE_ENUM_TYPE(Type):\ ret = #Type;\ break; switch(m_type) { AnyType_FOREACH_TYPES(AnyType_GETTYPESTRING); default: break; } return ret; } CAnyType::AnyTypeEnum CAnyType::GetTypeEnum()const { return m_type; } void CAnyType::ClearData() { if (m_data != 0) { #define AnyType_DELETE_DATA(Type) \ if (m_type == AnyType_DEFINE_ENUM_TYPE(Type))\ {\ delete (Type*)m_data;\ break;\ } while(true) { AnyType_FOREACH_TYPES(AnyType_DELETE_DATA); break; } } m_type = AnyTypeEnumBuffer; } AnyType_FOREACH_TYPES(AnyType_CREATE_CONSTRUCTOR); AnyType_FOREACH_TYPES(AnyType_CREATE_TYPE_OPERATOR); AnyType_FOREACH_TYPES(AnyType_CREATE_ASSIGNMENT);
大量使用C语言的宏,省去了非常多的麻烦,在头文件文件的最前面可以注册各种类型,
相关文章推荐
- 设计模式---行为类型---状态
- 白乔原创:万能类型boost::any
- c++中相似类型的一种设计方案
- 数据库设计之拆分与数据类型选择
- 测试设计中需要考虑的22种测试类型
- 主键设计用什么字段类型比较好?
- 关于数据库Varchar字段类型长度设计问题
- 设计模式---创建类型---原型
- 一个困惑的类层次设计根据:回调函数,避免向下类型转换(转)
- 数据库设计中实体关联的四种类型
- 从”如何设计一个通用数据类型的数组“谈什么才是程序员真正应该干的事
- 理解MySQL数据类型 避免数据库设计出现混乱
- 万能数据类型any杂谈
- NET设计规范二:类型成员设计
- Atitit.论图片类型 垃圾文件的识别与清理 流程与设计原则 与api概要设计 v2 pbj
- 【C++语言99个常见编程错误】第8章 类型设计问题
- MySQL 数据库设计之各种 INTEGER 类型最佳实践
- 《Effective C#》读书笔记——条目27:让类型支持序列化<使用C#表达设计>
- 万能类型boost::any