首页 > 解决方案 > 是否可以将未知类型的变量声明为类成员变量?

问题描述

所以我对 mersenne_twister 引擎及其能做什么很感兴趣,所以我决定将初始化它所需的几行代码放在我自己的类中,这样我只需要创建该类的一个实例就可以得到任何我想要的任何范围内的随机数,而不必每次需要时都重复这些行。

到目前为止我已经成功了,但是因为我希望我的代码尽可能便携和高效,所以我想根据现有的架构使用 64 位引擎。我想避免使用编译器定义的预处理器宏的方式,因为这对我来说似乎不是最干净的方法,并且每次我在代码中提到引擎时都需要我使用宏。

我的架构 l 宏如下所示:

#define CPU_ARCH sizeof(nullptr)*8

我在类的私有空间中声明了引擎,这样我就可以在构造函数中像这样初始化它:

engine = mt19937(seed);

并在我的随机函数中使用它,如下所示:

double Random::giveRnd() {
    return distribution(engine);
}

现在看起来不错,但我还没有找到一种方法来实现具有相同名称“引擎”的两种架构,以在启动时选择要使用的引擎。

我尝试了以下方法:

通过以下实现:

class Random {
      public:
      [...]

      private:
      template<typename T>
      T engine;

      [...]
};

有没有人知道如何以一种至少有点干净的方式使这成为可能?还是我需要依靠预处理器宏?

标签: c++templatesmersenne-twister

解决方案


您可以通过制作一个作为模板参数CPU_BITS的类模板来实现依赖于的行为,并且专门用于预期值。CPU_BITS例如:

#include <random>

template<size_t N> struct CpuOpts;
template<> struct CpuOpts<32> { using EngineType = std::mt19937; };
template<> struct CpuOpts<64> { using EngineType = std::mt19937_64; };

enum { CPU_BITS = sizeof(nullptr)*8 };
using CurrentCpuOpts = CpuOpts<CPU_BITS>;

struct Random
{
    CurrentCpuOpts::EngineType engine;
};

int main()
{
    Random r;
    r.engine.seed(123456);
}

推荐阅读