您的位置:首页 > 编程语言 > C语言/C++

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 = {"<
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: