【C++】一种优雅的枚举定义的代替技巧

枚举类型

比如,做事件触发系统。一般会用枚举类型,定义事件:

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 存取、网络传输等,需要关注确定的值,且不能修改

很多系统,仅程序运行态时用来区分不同的值,这时,如果有不需要额外维护值的方法,自然是更优雅的。

而上述方法,就非常简单、简洁的提供了自动生成不同值的一种方法

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fananchong2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值