非模板类中任意类型的c++成员变量

C++ member variable of any type in non-template class

本文关键字:c++ 成员 变量 类型 任意      更新时间:2023-10-16

是否有办法在类中存储模板或自动变量而不使类成为模板?我试图将指针存储到STL随机数生成器之一,但我无法找出任何方法来做到这一点,而不使整个类成为模板。这不是一个选项,因为将cpp中的所有内容移动到h文件将导致大量循环头文件包含,我不想处理。例如,它可以是这样的:

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.

如果你真的不需要模板,我可以想到两个选择:

  • 如果你的意思是任何类型,你可以使用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);