枚举类型
比如,做事件触发系统。一般会用枚举类型,定义事件:
enum {
EventRoleLevelUp = 1, // 玩家等级升级事件
EventTaskComplete = 2, // 任务完成事件
};
在看 https://github.com/alecthomas/entityx 代码时,发现一种更为优雅的定义方式
entityx 中的 event 类型例子
/// Used internally by the EventManager.
class BaseEvent {
public:
typedef std::size_t Family;
virtual ~BaseEvent();
protected:
static Family family_counter_;
};
/**
* Event types should subclass from this.
*
* struct Explosion : public Event<Explosion> {
* Explosion(int damage) : damage(damage) {}
* int damage;
* };
*/
template <typename Derived>
class Event : public BaseEvent {
public:
/// Used internally for registration.
static Family family() {
static Family family = family_counter_++;
return family;
}
};
以上的事件模板定义,那么比如,代码会这样定义事件:
struct EventRoleLevelUp : public Event<EventRoleLevelUp> {
EventRoleLevelUp(int roleID, int oldLv, int newLv) : roleID(roleID), oldLv(oldLv), newLv(newLv) {}
int roleID;
int oldLv;
int newLv;
};
struct EventTaskComplete : public Event<EventTaskComplete> {
EventTaskComplete(int roleID, int taskID) : roleID(roleID), taskID(taskID) {}
int roleID;
int taskID;
};
然后事件类型,通过继承Event
和首次调用时的先后顺序,自动生成:
auto eType1 = EventRoleLevelUp::family(); // 玩家等级升级事件的类型值
auto eType2 = EventTaskComplete::family(); // 任务完成事件的类型值
assert(eType1 + 1 = eType2);
其他
枚举值,在如 db 存取、网络传输等,需要关注确定的值,且不能修改
很多系统,仅程序运行态时用来区分不同的值,这时,如果有不需要额外维护值的方法,自然是更优雅的。
而上述方法,就非常简单、简洁的提供了自动生成不同值的一种方法