C++ 模拟C#/Java中的检举(enum)类型
2011-04-11 15:06
447 查看
在C++中enum类型仅仅相当于一系列的整数常量,如果要在日志中显示或标准输出打印时需要把整数与一个字符串对应起来,从配置文件中读取时为了配置文件的可读性最好配置的是字符串名称而不是数字,使用enum类型很不方便,而在C#和Java中都可以方便地使用enum类型的toString方法转换成字符串,或使用parse方法来从字符串转换为对应的enum类型。但我们可以使用类来实现类似C#的enum类型,使用其静态成员变量来代替各enum的各值,再增加相应的方法即可,例如实现一个表示一周各天的类:
class Weekday{
private:
typedef enum{ _Sunday, _Monday, _Tuesday, _Wednesday, _Thursday,_Friday, _Saturday , _END} WeekdayValue;
static const char* _names[];
const WeekdayValue _value;
Weekday(const WeekdayValue value)
:_value(value)
{
}
public:
int Value( void ) const { return _value; }
const char* Name( void ) const { return _names[_value]; }
operator int( void ) const { return (int)_value; }
public:
static Weekday Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday;
static Weekday Parse(const char* str);
static const char** GetNames( void ) { return _names; }
};
const char* Weekday::_names[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday" };
Weekday Weekday::Parse( const char* str )
{
for(int i=0; i
/** common */
#define DECLARE_ENUM_COMMON_METHODS( C) /
private: /
static const char* _names[]; /
const EnumValue _value; /
explicit C(const EnumValue value) /
:_value(value) /
{ /
if(_value > _END) /
throw std::exception("Invalid value of "#C); /
} /
public: /
int Value( void ) const { return _value; } /
const char* Name( void ) const { return _names[_value]; } /
operator int( void ) const { return (int)_value; } /
public: /
inline static const char** GetNames( void ) { return _names; } /
static C FromValue(const int value ); /
static C Parse(const char* str)
#define IMPLEMENT_ENUM_COMMON_METHODS( C ) /
C C::Parse( const char* str ) /
{ /
for(int i=0; i
#include
using namespace std;
#include "enum_class_demo.hpp"
ImplementEnum2(Result, OK, Error);
ImplementEnum3(E3, E3_1, E3_2, E3_3);
ImplementEnum4(E4, E4_1, E4_2, E4_3, E4_4);
ImplementEnum5(E5, E5_1, E5_2, E5_3, E5_4, E5_5);
ImplementEnum6(E6, E6_1, E6_2, E6_3, E6_4, E6_5, E6_6);
ImplementEnum7(E7, E7_1, E7_2, E7_3, E7_4, E7_5, E7_6, E7_7);
ImplementEnum8(E8, E8_1, E8_2, E8_3, E8_4, E8_5, E8_6, E8_7, E8_8);
ImplementEnum9(E9, E9_1, E9_2, E9_3, E9_4, E9_5, E9_6, E9_7, E9_8, E9_9);
ImplementEnum10(E10, E10_1, E10_2, E10_3, E10_4, E10_5, E10_6, E10_7, E10_8, E10_9,E10_10);
ImplementEnum4(Season, Spring, Summer, Autumn, Winter);
int main( void )
{
cout<<"ok = {"<
class Weekday{
private:
typedef enum{ _Sunday, _Monday, _Tuesday, _Wednesday, _Thursday,_Friday, _Saturday , _END} WeekdayValue;
static const char* _names[];
const WeekdayValue _value;
Weekday(const WeekdayValue value)
:_value(value)
{
}
public:
int Value( void ) const { return _value; }
const char* Name( void ) const { return _names[_value]; }
operator int( void ) const { return (int)_value; }
public:
static Weekday Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday;
static Weekday Parse(const char* str);
static const char** GetNames( void ) { return _names; }
};
const char* Weekday::_names[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday" };
Weekday Weekday::Parse( const char* str )
{
for(int i=0; i
/** common */
#define DECLARE_ENUM_COMMON_METHODS( C) /
private: /
static const char* _names[]; /
const EnumValue _value; /
explicit C(const EnumValue value) /
:_value(value) /
{ /
if(_value > _END) /
throw std::exception("Invalid value of "#C); /
} /
public: /
int Value( void ) const { return _value; } /
const char* Name( void ) const { return _names[_value]; } /
operator int( void ) const { return (int)_value; } /
public: /
inline static const char** GetNames( void ) { return _names; } /
static C FromValue(const int value ); /
static C Parse(const char* str)
#define IMPLEMENT_ENUM_COMMON_METHODS( C ) /
C C::Parse( const char* str ) /
{ /
for(int i=0; i
#include
using namespace std;
#include "enum_class_demo.hpp"
ImplementEnum2(Result, OK, Error);
ImplementEnum3(E3, E3_1, E3_2, E3_3);
ImplementEnum4(E4, E4_1, E4_2, E4_3, E4_4);
ImplementEnum5(E5, E5_1, E5_2, E5_3, E5_4, E5_5);
ImplementEnum6(E6, E6_1, E6_2, E6_3, E6_4, E6_5, E6_6);
ImplementEnum7(E7, E7_1, E7_2, E7_3, E7_4, E7_5, E7_6, E7_7);
ImplementEnum8(E8, E8_1, E8_2, E8_3, E8_4, E8_5, E8_6, E8_7, E8_8);
ImplementEnum9(E9, E9_1, E9_2, E9_3, E9_4, E9_5, E9_6, E9_7, E9_8, E9_9);
ImplementEnum10(E10, E10_1, E10_2, E10_3, E10_4, E10_5, E10_6, E10_7, E10_8, E10_9,E10_10);
ImplementEnum4(Season, Spring, Summer, Autumn, Winter);
int main( void )
{
cout<<"ok = {"<
相关文章推荐
- Java/C#/C/C++基本数据类型一览
- C#/Java/C/C++基本类型所占大小及表示范围
- C#/Java/C/C++基本类型所占大小及表示范围
- C/C++/Java/C#语言的基本类型
- C#/Java/C/C++基本类型所占大小及表示范围
- C/C++/Java/C#的基础类型模型的定义
- C#/Java/C/C++基本类型所占大小及表示范围
- 让Java中的Interface成为你的C++ enum类型.
- java——与c++之不同——复合类型——enum
- 浅谈C++/JAVA/C#运行机制和执行效率
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- C#基本数据类型与C++区别
- C#与C/C++类型对照表
- java + (C++) != C#
- C#与Java对比学习:数据类型、集合类、栈与队列
- C++与C#之间数据类型对照
- atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js
- C#与C++类型对应关系总结
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
- 如何在C#中模拟C++的联合(union)