我有这种模式:
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,label)。但是我不能简单地调用x-> DoAppropriateThingFor(label,y);我只是回到基于标签创建一个长的if / else级联...
请随时要求我进一步澄清。因为我还没有机会真正使用lambda,所以我在黑暗中摸索着……
最佳答案
只要所有的lambda都不捕获(即[]
为空),就可以使用函数指针:
struct Table {
const char* label;
void (*lambda)(const char*, Thing*);
};
如果任何Lambda都是有状态的(即
[]
不为空),则不能使用函数指针。您可以使用std::function
:struct Table {
const char* label;
std::function<void(const char*, Thing*)> lambda;
};
Visual C++ 2010不支持Lambda到函数指针的转换(在Visual C++ 2010发布之后,该转换已添加到该语言中),但是Visual C++ 11 Developer Preview确实支持该转换。如果使用的是Visual C++ 2010,则可以使用
std::function
解决方案。关于c++ - 我可以创建一个具有相同签名的String + lambda表吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8042532/