非模板类中的任何类型的C++成员变量

问题描述:

有没有某种方法可以将类或模板中的模板或自动变量存储在模板中?我试图存储一个指向其中一个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 '。 Cheers&hth。, – 2011-12-20 04:22:11

+0

您确定要将* ANY *类型储存在RNG中吗?你不能以某种方式限制它吗?我的意思是,你想存储一个指向类的指针,一个指向原始类型的指针等等吗? – Lucian 2011-12-20 06:38:23

我能想到的两个选项,如果你真的不想要的模板:

  • 如果你从字面上的意思是任何类型的,你可以使用void *。这不是非常安全的类型,而且类的用户必须确切地知道使用它的实际类型。
  • 如果您可以将类型限制为某个基本接口/类,则可以使用指向该类型的指针,例如, IRandom *。一般来说,这似乎更有用/可用。

安全正确的方法是定义一个描述接口的类并在实际实现中继承它。

实施例:

class RNG { 
    public: 
     virtual int get(void) = 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