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