2011-07-21 96 views
0

我有很多的數據,並在一個循環內,我需要把選擇。每個條目都是一個物理事件。在每一個事件中只有一個與它的屬性粒子:比枚舉更好

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_CONVPHOPHO_1TRKPHO_CONV
  3. ParticleType_type具有一定的屬性,如名稱,FILE_NAME多
  4. 現在我需要使用r步驟100和200不翻倍的類別,如PHORx我想參數化在一定的範圍內方式,可能使用模板參數的某處
  5. 我需要跨越類別例如創建PHOR1_1TRK
  6. (不太相關)我主導I/O。目前,如果我要處理PHOELE我需要跑兩次,我想在同一時間做這些

我認爲最好的解決方案是創建一個類每ParticleType_type,並把功能類似get_file_name爲成員函數。問題是類不是對象,所以我不能將它們作爲函數的參數傳遞:例如,現在我可以使用enum來編寫一個自由函數,它將ParType_type作爲參數,但是我不能使用類。

我想創建自動參數類型,例如PHORX。

有人建議一些tecniques?用於各顆粒類型

+0

你不能創建一個將類類型作爲參數的函數嗎?這是最基本的問題嗎?因爲如果是這樣,你可以。 – Chad

+0

@Chad:怎麼樣? 「PartType_type」的決定是在運行時完成的,因此我無法使用模板 –

+0

爲每種類型創建特定的覆蓋。請參閱下面的MRAB的答案。 – Chad

回答

1

創建類((可能抽象)粒子類的子類)看起來像正確的方法。

你不會傳遞一個類到一個函數,你會通過該類的實例

0

,而不是編寫單獨的類爲所有的粒子可以使用表驅動的方法(見例如here)。

您可以創建它採用了ParticleType_type爲指標得到一個函數指針或boost::function,做具體的粒子處理的表格。

3

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