我有這樣的模式:我可以製作具有相同簽名的String + lambda表嗎?
Thing * y = FindNearestItem();
if (y && (MenuElement * x = FindMenuElementNamed("Identity")))
x->SetText(FString("%.1f", y));
else if (x)
x->Clear();
if (y && (MenuElement * x = FindMenuElementNamed("X1")))
x->SetLocalData(y);
else if (x)
x->Clear();
基本上,我想用一個靜態表: [警告:真的馬虎概念性代碼,無效的,我是一個小白,你已經被警告]:
struct Table {
const char * label;
?lambda? lambda;
} MyTable[] = {
"Identity", [] (const char * label, Thing * y) { MenuElement * x = FindMenuElementNamed(label); (y && x) ? x->SetText(FString("%.1f", y)) : x->Clear(); },
"X1", [] (const char * label, Thing * y) { MenuElement * x = FindMenuElementNamed(label); (y && x) ? x->SetLocalData(y) : x->Clear(); },
};
Thing * y = FindNearestItem();
for (int i = 0; i != countof(MyTable); ++i)
MyTable[i].lambda(MyTable[i].label, y);
請記住,每個標籤的動作都不相同 - 我的表中的每一行都是不同的。
所以模式大部分是一樣的,但方差在採取行動,雖然它在每種情況下使用相同的數據集(x,y,標籤)。但我不能簡單地調用x-> DoAppropriateThingFor(label,y);我只是回到創建一個長的基於標籤的if/else級聯...
隨意問我進一步的澄清。由於我還沒有機會真正使用它們,所以我在混合lambdas的黑暗中...
我可以想到一些明顯的改進 - 比如將if!x條件放在lambda之外,因爲這是一個不變量。但是我需要知道是否追求這一點是有道理的。 :) – Mordachai
我相信你會在這裏需要一個模板,因爲你不能聲明lambda類型的名稱IIRC – JaredPar