gpt4 book ai didi

c++ - 通过模板为项目范围内的唯一 ID 自动增加类型

转载 作者:行者123 更新时间:2023-11-30 03:06:22 25 4
gpt4 key购买 nike

既然您想知道它的用途,那么这里有一些背景知识。

我们大量使用我们自己的事件系统。典型实现:

  • Listener 注册到一些 Event
  • EventManager 在主循环中调度事件
  • Listener 处理给定的 Event 并做一些......

现在,Listener 必须识别Event 类型,以便将其转化为有用的东西。为此,Event 类有一个名为 idint 成员。为了保证由 enum 提供的 ID 的唯一性,需要将它们放在一个集中且可访问的位置,以便任何人都可以添加 id在创建新的 Event 类型之前......你明白了。

我曾经试图降低这个系统的相对复杂性,以允许用户(程序员)以更简单的方式创建新的Event,而不会失去的安全性>独特性

所以我决定采用这样的方式:

事件库.h

class EventBase
{
public:
virtual int getId() const = 0;
static int registerEvent() { return ++numberOfEvent_;}
private:
static int numberOfEvent_;
};

事件库.cpp

int EventBase::numberOfChild_ = 0;

事件.h

template<class T>
class Event : public EventBase
{
public:
virtual int getId() const { return id_;}
static const int id_;
};

template<class T> const int Event<T>::id_ = EventBase::registerEvent();

事件_1.h

class Event_1 : public Event<Event_1> {};

事件_2.h

class Event_2 : public Event<Event_2> {};

所以基本上任何新的 Event 类型都有它自己的静态 const id,这取决于定义的 Event 类型的数量,到目前为止我们不必搞砸enum ...我唯一的问题是我们需要正确定义模板参数,否则许多Event可以共享相同的id。

所以我的问题是,有没有办法“隐藏”模板参数?

以这样的结尾:

class Event_1 : public Event {};

最佳答案

C++ 已经有了类型系统。

使每个 Event 具有不同的、多态的派生类型。

你的 Listener 应该像这样注册一个事件(为了论证假设单例 EventManager):

EventManager::registerCallback<cattle_prod_event>(bind(&Me::onCattleProd, this, _1));

并实现一个成员函数:

void Me::onCattleProd(cattle_prod_event const* msg) {}

现在您确切地知道在接收时消息的类型。

这里唯一的缺点是存储回调变得更加复杂。 (但是,从 API 向下构建您的系统!)

关于c++ - 通过模板为项目范围内的唯一 ID 自动增加类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6708228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com