2016-08-06 68 views
-2

矢量我有這樣的代碼:的std ::有一個模板參數

template<class T> void Engine::extend(std::string name) { 
    T *instance = new T(this); 
    this->newExtensions[name] = instance; 
} 

這就是所謂的以這樣的方式:

engine.extend<Menu>("menu"); 

它完美,但我想創建一個新的實例T後來在我的代碼中(在我的遊戲的主循環中),而不是在Engine::extend方法中那樣做。是否有可能將關於類的信息保存在矢量或任何其他數據結構中,這些數據結構將在整個Engine類中共享,所以稍後可以用其他方法調用它?我試圖實現的僞代碼:

template<class T> void Engine::extend(std::string name) { 
    this->newExtensions[name] = T; 
} 
+0

什麼是 「newExtensions」? –

+0

我不太明白,'this-> newExtensions'的類型是什麼? –

+0

對不起,這是一張地圖。 – solusipse

回答

1

您要創建的類型是否有共同的基礎? 和C++一樣,你不能擁有不相關類型的集合(vector/map),類型應該有一個通用的基類,以使下面的代碼可以工作。 (否則,您可以用void *,但轉化率不會是安全的):

#include <iostream> 
#include <map> 

class Entity { 
    public: 
    virtual ~Entity(){} 
}; 

class C1: public Entity 
{ 
    public: 
    void doSomething(){std::cout << "C1" << std::endl;} 
}; 

class C2: public Entity 
{ 
    public: 
    void doSomething(){std::cout << "C2" << std::endl;} 
}; 

class C3 
{ 
    public: 
    void doSomething(){std::cout << "C3" << std::endl;} 
}; 



class CreatorBase { 
    public: 
     virtual ~CreatorBase() {}; 
     virtual Entity* create() = 0; 
}; 

template<typename T> 
class Creator: public CreatorBase { 
    public: 
     Entity* create() 
     { 
      return new T; 
     }  
}; 

std::map<int, CreatorBase*> cmap; 

在這裏,我們有一個基類的實體和C1和C2從它繼承。 接下來,有模板類Creator,它創建所請求類型的對象。

它們都從CreatorBase繼承,以便它們可以存儲在地圖中。

創建者返回實體*併爲了類型安全性,我們可以在調用create()時使用動態轉換,以確保我們創建正確的類型。

如果您只需要一個實體指針,則可以在任何地方使用實體*,並且不需要動態強制轉換。

int main(int argc, char *argv[]) 
{ 
    cmap[1]=new Creator<C1>; 
    cmap[2]=new Creator<C2>; 
    //cmap[3]=new Creator<C3>; //will not compile - C3 does not derive from Entity 

    C1 *i1 = dynamic_cast<C1*> (cmap[1]->create()); 
    C2 *i2 = dynamic_cast<C2*> (cmap[2]->create()); 
    C1 *i3 = dynamic_cast<C1*> (cmap[2]->create()); //bad dynamic cast: cmap[2] does not create C1 

    if (!i1) { 
     std::cout << "i1: Bad dynamic cast" << std::endl; 
    } else {  
     i1->doSomething(); 
    } 

    if (!i2) { 
     std::cout << "i2: Bad dynamic cast" << std::endl; 
    } else {  
     i2->doSomething(); 
    } 

    if (!i3) { 
     std::cout << "i3: Bad dynamic cast" << std::endl; 
    } else { 
      i3->doSomething(); 
    } 
} 

輸出:

C1 
C2 
i3: Bad dynamic cast 
+0

非常複雜,但確實是我想要的,非常感謝! – solusipse

相關問題