【问题标题】:C++ member variable of any type in non-template class非模板类中任意类型的C++成员变量
【发布时间】:2012-01-24 03:14:15
【问题描述】:

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

【问题讨论】:

  • 为什么需要一个模板?常规继承不行吗?
  • ¤ 您可以简单地存储一个std::function&lt; double() &gt;。干杯&hth.,
  • 您确定要在 RNG 中存储 ANY 类型吗?你不能以某种方式限制它吗?我的意思是,您要存储指向类的指针、指向原始类型的指针等等吗?
  • 不是真正的 any 类型。我应该更具体。我更新了它,所以它更有意义。我真的在努力让它适用于任何 STL RNG,但我不知道它们有什么通用基类(如果有的话),所以我不知道如何让它工作。

标签: c++ class templates member


【解决方案1】:

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);

如果这是所有随机数生成器的组成部分,甚至函数指针也可以。

【讨论】:

  • 如果我知道所有 RNG 的基类是什么就可以了,但目前我不知道。更新了问题的详细信息。
【解决方案2】:

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

例子:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2017-02-19
      相关资源
      最近更新 更多