2016-12-02 30 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(); 
} 
相關問題