我有很多的數據,並在一個循環內,我需要把選擇。每個條目都是一個物理事件。在每一個事件中只有一個與它的屬性粒子:比枚舉更好
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
具有一定的屬性,如名稱,FILE_NAME多 - 現在我需要使用
r
步驟100和200不翻倍的類別,如PHORx
我想參數化在一定的範圍內方式,可能使用模板參數的某處 - 我需要跨越類別例如創建
PHOR1_1TRK
- (不太相關)我主導I/O。目前,如果我要處理
PHO
和ELE
我需要跑兩次,我想在同一時間做這些
我認爲最好的解決方案是創建一個類每ParticleType_type,並把功能類似get_file_name
爲成員函數。問題是類不是對象,所以我不能將它們作爲函數的參數傳遞:例如,現在我可以使用enum
來編寫一個自由函數,它將ParType_type
作爲參數,但是我不能使用類。
我想創建自動參數類型,例如PHORX。
有人建議一些tecniques?用於各顆粒類型
你不能創建一個將類類型作爲參數的函數嗎?這是最基本的問題嗎?因爲如果是這樣,你可以。 – Chad
@Chad:怎麼樣? 「PartType_type」的決定是在運行時完成的,因此我無法使用模板 –
爲每種類型創建特定的覆蓋。請參閱下面的MRAB的答案。 – Chad