C++ 列举所有SomeClass<;T>;所有T的对象

C++ 列举所有SomeClass<;T>;所有T的对象,c++,events,templates,C++,Events,Templates,我有事件句柄的Event类,其中T是签名的函子类型void(*)((或一些基于类的闭包) 在下面的代码中,复制构造的对象以映射事件 template <class T> class Event { ... T action; long explode; static map<string, Event> events; ... void shot() { action(); } ...

我有事件句柄的
Event
类,其中
T
是签名的函子类型
void(*)(
(或一些基于类的闭包)

在下面的代码中,复制构造的对象以映射
事件

template <class T>
class Event
{
    ...
    T action;
    long explode;
    static map<string, Event> events;
    ...
    void shot()
    {
        action();
    }
    ...
    static void check()
    {
        // foreach pair in events
        if (itsATimeFor(pair->second.explode))
            pair->second.shot();
    }
};
模板
班级活动
{
...
T作用;
长时间爆炸;
静态地图事件;
...
无效射击()
{
动作();
}
...
静态无效检查()
{
//事件中的每一对
if(itsATimeFor(配对->秒分解))
配对->第二个.shot();
}
};
check()
函数测试是否有任何事件在其孔中开火并成功射击

当前的实现有一些主要的错误:它只测试每个调用的一种类型的事件,因此是无用的


问题是,如何从所有实例化的
事件
类中枚举所有事件?

我认为您需要一个公共基类,这意味着您可以将所有这些内容存储在一个集合中。要做到这一点,您必须摆脱
静态的
东西,但我并不认为这是一个真正的问题

class IEvent
{
public:
    virtual ~IEvent() = 0  { };
    virtual void check() = 0;
};  // eo interface IEvent


template<class T>
class Event : public IEvent
{
public:
    virtual ~Event()
    {
    }; // eo dtor

    void check()
    {
    };
};  // eo class Event
类事件
{
公众:
virtual~IEvent()=0{};
虚空检查()=0;
};  // eo接口事件
模板
类事件:公共事件
{
公众:
虚拟事件()
{
};//eo dtor
无效检查()
{
};
};  // eo级活动

现在,您可以根据需要实例化事件类并将它们放入集合中。这样,您就可以枚举它们并对每个实例调用
check()
。我看你没有理由在这里使用
static
。如果您觉得有必要将这些静态数据放在那里,我可以帮助您删除它们。

我认为您需要一个公共基类,这意味着您可以将所有这些数据存储在一个集合中。要做到这一点,您必须摆脱
静态的
东西,但我并不认为这是一个真正的问题

class IEvent
{
public:
    virtual ~IEvent() = 0  { };
    virtual void check() = 0;
};  // eo interface IEvent


template<class T>
class Event : public IEvent
{
public:
    virtual ~Event()
    {
    }; // eo dtor

    void check()
    {
    };
};  // eo class Event
类事件
{
公众:
virtual~IEvent()=0{};
虚空检查()=0;
};  // eo接口事件
模板
类事件:公共事件
{
公众:
虚拟事件()
{
};//eo dtor
无效检查()
{
};
};  // eo级活动

现在,您可以根据需要实例化事件类并将它们放入集合中。这样,您就可以枚举它们并对每个实例调用
check()
。我看你没有理由在这里使用
static
。如果您觉得有必要将这些静态设置放在那里,我可以帮助您删除它们。

您似乎正在构建自己的事件处理系统。您是否考虑过使用?似乎您正在构建自己的事件处理系统。你考虑过使用吗?我已经按照你写的那样做了。我更喜欢在这里使用集合,因此在我的版本库中,ctor是抽象的,将它包括在集合和dtor中,当然还有
虚拟void shot()=0
静态void pullTheTrigger()
。我现在已经像你写的那样做了。我更喜欢在这里使用集合,因此在我的版本库中,ctor是抽象的,将其包含在集合和数据中,或者排除,当然还有
虚拟void shot()=0
静态void pullTheTrigger()