我有很多数据,在循环中我需要选择。每个条目都是物理事件。在每个事件中,只有一个粒子具有其属性:
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";
你可以看到:
PHO_CONV
是PHO
而PHO_1TRK
是PHO_CONV
ParticleType_type
都有一些属性,例如name,file_name和更多PHORx
使用r
步长为100而不是200来加倍像PHOR1_1TRK
这样的类别。我想以某种方式对范围进行参数化,可能在某处使用模板参数PHO
ELE
和get_file_name
,我需要运行两次,我想同时执行这些操作我认为最好的解决方案是为每个ParticleType_type创建一个类,并将enum
之类的函数作为成员函数。问题是类不是对象所以我不能将它们作为函数的参数传递:例如,使用ParType_type
现在我可以编写以{{1}}作为参数的自由函数,但是使用类我不能。
我想自动创建参数类型,例如PHORX。
有人可以提出一些技巧吗?
答案 0 :(得分:3)
Flyweight pattern可能对您有用。
不是每个粒子的实例都有一个类型的枚举,而是每个粒子类型有一个实例,并且该类型的每个粒子都有一个指向此实例的指针。粒子类型将采用指向粒子结构的指针进行计算。
e.g。
// 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);
}
答案 1 :(得分:1)
为每个粒子类型创建类((可能是抽象的)粒子类的子类)看起来就像是正确的方法。
您不会将类传递给函数,而是传递该类的实例。
答案 2 :(得分:0)
不是为所有粒子编写单独的类,而是使用表驱动方法(参见例如here)。
您将创建一个表,该表使用ParticleType_type
作为索引来获取函数指针或boost::function
来执行粒子特定处理。