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

时间:2011-12-20 04:06:15

标签: c++ class templates member

有没有办法在类中存储模板或自动变量而不使类成为模板?我正在尝试存储指向其中一个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。

3 个答案:

答案 0 :(得分:5)

如果您真的不想要模板,我可以考虑两个选项:

  • 如果你的字面意思是任何类型,你可以使用void *。这不是非常类型安全的,并且该类的用户必须确切地知道它实际上用它做什么类型。
  • 如果您可以将类型约束到某个基本接口/类,则可以使用指向该类型的指针,例如IRandom *。这似乎更有用/可用。

答案 1 :(得分:0)

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

示例:

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

答案 2 :(得分: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);

如果你的所有随机数生成器都是由<。p>组成的,那么甚至函数指针都可以