2011-12-20 120 views
3

有沒有某種方法可以將類或模板中的模板或自動變量存儲在模板中?我試圖存儲一個指向其中一個STL隨機數生成器的指針,但我無法想出任何方式來做到這一點,而不需要將整個類放入模板中。這不是一個選項,因爲將cpp中的所有內容移到h文件中會導致大量的循環頭文件包含我不想處理的內容。因此,例如,它會是這樣的:非模板類中的任何類型的C++成員變量

class tSomeClass 
{ 
    public: 
     template<typename RNG> 
     tSomeClass(RNG * rng) : fRNG(rng) { } 

    private: 
     RNG * fRNG; // How do I get this working??? 
}; 

到目前爲止,一切我來了總是需要有整個班級爲模板,所以我難倒結束。

編輯:我知道我忘了提到的東西。我不能使用繼承來指定RNG類型,因爲我不知道基類是什麼,除非有人知道STL使用的RNG的基類是什麼。目前我使用std :: default_random_engine。

+0

爲什麼你需要這個模板?會不會正常繼承工作? – dasblinkenlight 2011-12-20 04:12:26

+0

¤您可以簡單地存儲'std :: function < double() >'。 Cheers&hth。, – 2011-12-20 04:22:11

+0

您確定要將* ANY *類型儲存在RNG中嗎?你不能以某種方式限制它嗎?我的意思是,你想存儲一個指向類的指針,一個指向原始類型的指針等等嗎? – Lucian 2011-12-20 06:38:23

回答

5

我能想到的兩個選項,如果你真的不想要的模板:

  • 如果你從字面上的意思是任何類型的,你可以使用void *。這不是非常安全的類型,而且類的用戶必須確切地知道使用它的實際類型。
  • 如果您可以將類型限制爲某個基本接口/類,則可以使用指向該類型的指針,例如, IRandom *。一般來說,這似乎更有用/可用。
0

安全正確的方法是定義一個描述接口的類並在實際實現中繼承它。

實施例:

class RNG { 
    public: 
     virtual int get(void) = 0; 
} 
0

的C的方法是使用一般的指針(void*),然而,因爲這是C++只是利用繼承的和動態綁定,即:

class RNG /* random number generator interface/base class */ 
{ 
    public: 
     virtual int randomize(void) = 0; 
}; 

class RandomA : public RNG /* one implementation of a random num generator */ 
{ 
    public: 
     int randomize() { return 4; } 
}; 

class RandomB : public RNG /* another implementation of a random num generator */ 
{ 
    public: 
     int randomize() { return 0; } 
}; 

class tSomeClass 
{ 
    public: 
     tSomeClass(RNG * rng) : fRNG(rng) { } 

    private: 
     RNG * fRNG; 
}; 

... 

RandomA randomObj; 
tSomeClass t(&randomObj); 

或者即使是一個函數指針,如果這是你所有的隨機數生成器組成的。

+0

如果我知道所有RNG的基類是什麼,但是目前我不知道,那就行了。詳細更新了問題。 – Shenjoku 2011-12-20 04:31:10

相關問題