c++ - 比枚举好

标签 c++ class templates metaprogramming

我有很多数据,我需要在一个循环中进行选择。每个条目都是一个物理事件。在每个事件中,只有一个粒子具有以下属性:

for (...)   {  // loop over entries in the data
    if (not selection()) continue;
    ...
}

我从命令行选择要考虑的特定类型的粒子,例如:

Options options = get_options(argc, argv);

enum ParticleType_type {ELE, PHO, ...}

cout << "particle: " << get_particle_name(options.particle_type);

for (entry in data) { // loop over data
    // read variale like PDG, conv, ... for the entry
    switch (options.particle_type)
    {
          case ELE: if (PDG != 11) continue; break;
          case PHO: if (PDG != 22) continue; break;
          case PHO_UNC:   if (PDG != 22 or conv) continue; break;
          case PHO_CONV:  if (PDG != 22 or !conv) continue; break;
          case PHO_1TRK:  if (PDG != 22 or !conv or !is1trak) continue; break;
          case PHO_2TRK:  if (PDG != 22 or !conv or !is2trak) continue; break;
          case PHOR1:     if (PDG != 22 or !conv or !(r>0 and <=200) continue; break;
          case PHOR2:     if (PDG != 22 or !conv or !(r>200 and <=400) continue; break;
          case PHOR3:     if (PDG != 22 or !conv or !(r>400 and <=600) continue; break;
          case PHOR4:     if (PDG != 22 or !conv or !(r>600 and <=800) continue; break;
    }

    do_something();

    if (isPhoton(options.particle_type)) // true for every PHO_XXX
    {
         if (options.particle_type in [PHORX])
         {
              int rbin = get_Rbin(options.particle_type) // PHOR1 -> 1, PHOR2 -> 2
              ...
         }  
         ...
    }
}

cout << "output: " << get_file_name(options.particle_type) + ".out";

如你所见:

  1. 不是一团糟
  2. 有子类别,例如 PHO_CONV 是一个 PHOPHO_1TRK 是一个 PHO_CONV
  3. 每个 ParticleType_type 都有一些属性,比如名称、文件名等等
  4. 现在我需要使用 r 步长 100 而不是 200 将类别加倍,例如 PHORx。我想以某种方式对范围进行参数化,可能在某处使用模板参数
  5. 我需要跨越类别,例如创建 PHOR1_1TRK
  6. (不太相关)我在 I/O 方面占主导地位。目前,如果我想处理 PHOELE,我需要运行两次,我想同时执行它们

我认为最好的解决方案是为每个 ParticleType_type 创建一个类,并将像 get_file_name 这样的函数作为成员函数。问题是类不是对象,所以我不能将它们作为函数的参数传递:例如使用 enum 现在我可以编写将 ParType_type 作为一个论点,但对于类我不能。

我想自动创建参数类型,例如 PHORX。

有人可以推荐一些技巧吗?

最佳答案

Flyweight pattern在这里可能对您有用。

不是为每个粒子创建一个实例并为其类型枚举,而是为每个粒子类型创建一个实例,并为该类型的每个粒子创建一个指向该实例的指针。粒子类型将采用指向您的粒子结构的指针进行计算。

例如

// pseudocode!
ParticleA a;
ParticleB b;

struct ParticleData {
  Particle * type;
  int data;
} particles[] = {
  { &a, 5 },
  { &a, 7 },
  { &b, 4 },
 // ... 
};

for each( particle in particles ) {
  particle->type->do_something(particle);
}

关于c++ - 比枚举好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6780883/

相关文章:

c++ - cygwin cmake 找不到 boost 库

c++ - 子系统:native中的异常处理

父类不能在静态上下文中使用 PHP const/static 变量

swift - 如何从其他文件夹引用类

c++ - 模板 `inline` 函数的静态局部变量

c++ - 通用函数调度机制

c++ - 执行双浮点除法的正确算法是什么?

c++ - WinRT API 无法获取 IDeviceIoControl

c++ - 为 C 消费包装 C++ 类 API

c++ - 为什么模板不能在 extern "C" block 内?