2016-12-02 53 views
0

我试图在名为InputManager的类中存储std::vector,该类存储侦听器。如果类型需要模板,如何存储std :: vector

我有一个名为Listener的超类。该类具有存储在模板中的类型的变量。

template <class obj> 
class Listener 

派生类的基础上定义的监听器类型的模板:没有定义类型

class onClickListener : public Listener<Button*> 

我怎么能存储Listenersstd::vector

std::vector<Listener<obj>> InputManager::listeners = std::vector<Listener<obj>>() 

class InputManager 
{ 
public: 
    template <class obj> 
    InputManager(GLFWwindow* window); 

    template <class obj> 
    void run(); 
    ~InputManager(); 
    static InputManager* Self; 
    template<class obj> 
    void addListener(Listener<obj>* listener); 
private: 
    GLFWwindow* window; 
    static std::vector<Listener<obj>> InputManager::listeners = std::vector<Listener<obj>>(); 
}; 

如果您需要更多信息,请让我知道。

+3

* CRTP *是静态的多态性。如果你想要运行时多态行为(这是你要求的向量元素引用不同的动态实例),你需要非模板继承。 – Pixelchemist

+0

我怎么能够保持有能力将这些变量存储在没有模板的Listener中? –

回答

0

没有你只是一个普通的非模板的基础类型的模板:

#include <vector> 
#include <iostream> 
#include <utility> 
#include <memory> 

struct listener { virtual void action() = 0; virtual ~listener() {} }; 

struct onClickListener : listener { 
    void action() override { std::cout << "click: " << this << '\n'; } 
}; 

struct input_manager 
{ 
    std::vector<listener*> listeners; 
    void add_listener(listener* lisp) 
    { 
     listeners.push_back(lisp); 
    } 
    void doit() const 
    { 
     for(auto&& lp : listeners) { if(lp) lp->action(); } 
    } 
}; 

int main() 
{ 
    input_manager mgr; 
    auto listen_a = std::make_unique<onClickListener>(); 
    auto listen_b = std::make_unique<onClickListener>(); 
    mgr.add_listener(listen_a.get()); 
    mgr.add_listener(listen_b.get()); 
    mgr.doit(); 
} 
相关问题