【发布时间】:2011-11-07 20:59:22
【问题描述】:
我有这个模式:
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 之外,因为这是一个不变量。但我需要知道追求这一点是否有意义。 :)
-
我相信你在这里需要一个模板,因为你不能声明一个 lambdas 类型名称 IIRC
标签: c++ visual-studio-2010 lambda c++11