枚举和枚举类详解

1 枚举和枚举类区别

1.1 类型

枚举是一组具有相同类型的命名常量集合,通常用于表示一些特定的状态或选项等。

而枚举类是一种特殊的类,它用于创建一个包含一组具有相同类型的命名常量集合的类型。枚举类中的每个成员都是该类的一个静态实例。

1.2  实例化

enum Color {
  RED,
  GREEN,
  BLUE
}
 
Color red = Color.RED;
enum class Color {
  RED,
  GREEN,
  BLUE
};
 
Color c = Color::RED;

1.3 命名空间

#include<iostream>
using namespace std;
 
int main(){
	enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
	cout << Sun << endl;
	cout << week::Sun << endl;
	int Sun;//这句是错误的,因为枚举类型已经占用了Sun这个关键字啦,不能再使用了 
	return 0;
}
#include<iostream>
using namespace std;
 
 
 
int main(){
	enum class week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
	enum class week1:unsigned int {Sun, Mon, Tue, Wed, Thu, Fri, Sat};//指定枚举的底层类型 
	cout << static_cast<int>(week::Sun) << endl;
	int Sun;//这句话是对的,enum class解决了域的问题 
	return 0;
}

2 宏搭配枚举类

#include <vector>
#include <iostream>

using namespace std;

#define HTTP_METHOD_MAP(XX)         \
  XX(0,  DELETE,      DELETE)       \
  XX(1,  GET,         GET)          \
  XX(2,  HEAD,        HEAD)         \
  XX(3,  POST,        POST)         \
  XX(4,  PUT,         PUT)          \
  /* pathological */                \
  XX(5,  CONNECT,     CONNECT)      \
  XX(6,  OPTIONS,     OPTIONS)      \
  XX(7,  TRACE,       TRACE)        \
  /* WebDAV */                      \
  XX(8,  COPY,        COPY)         \
  XX(9,  LOCK,        LOCK)         \
  XX(10, MKCOL,       MKCOL)        \
  XX(11, MOVE,        MOVE)         \
  XX(12, PROPFIND,    PROPFIND)     \
  XX(13, PROPPATCH,   PROPPATCH)    \
  XX(14, SEARCH,      SEARCH)       \
  XX(15, UNLOCK,      UNLOCK)       \
  XX(16, BIND,        BIND)         \
  XX(17, REBIND,      REBIND)       \
  XX(18, UNBIND,      UNBIND)       \
  XX(19, ACL,         ACL)          \
  /* subversion */                  \
  XX(20, REPORT,      REPORT)       \
  XX(21, MKACTIVITY,  MKACTIVITY)   \
  XX(22, CHECKOUT,    CHECKOUT)     \
  XX(23, MERGE,       MERGE)        \
  /* upnp */                        \
  XX(24, MSEARCH,     MSEARCH)     \
  XX(25, NOTIFY,      NOTIFY)       \
  XX(26, SUBSCRIBE,   SUBSCRIBE)    \
  XX(27, UNSUBSCRIBE, UNSUBSCRIBE)  \
  /* RFC-5789 */                    \
  XX(28, PATCH,       PATCH)        \
  XX(29, PURGE,       PURGE)        \
  /* CalDAV */                      \
  XX(30, MKCALENDAR,  MKCALENDAR)   \
  /* RFC-2068, section 19.6.1.2 */  \
  XX(31, LINK,        LINK)         \
  XX(32, UNLINK,      UNLINK)       \
  /* icecast */                     \
  XX(33, SOURCE,      SOURCE)       \

enum class HttpMethod {
#define XX(num, name, string) name = num,
    HTTP_METHOD_MAP(XX)//代表所有的XX()
#undef XX
    INVALID_METHOD
};

const char* HttpMethodToString(const HttpMethod& m) {
    switch(m) {
#define XX(num, name, string) \
        case HttpMethod::name: \
            return #string;
        HTTP_METHOD_MAP(XX);
#undef XX
        default:
            return "<unknown>";
    }
}

int main(){
    HttpMethod method = HttpMethod::POST;
    cout<<HttpMethodToString(method)<<endl;    
}
输出:POST

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值