C++ C++;11 if else中的lambda函数定义
我如何做这样的事情,但以一种编译的方式,希望没有疯狂的typedefC++ C++;11 if else中的lambda函数定义,c++,c++11,lambda,auto,C++,C++11,Lambda,Auto,我如何做这样的事情,但以一种编译的方式,希望没有疯狂的typedef auto b; auto g; if (vertical) { b = [=, &b_](int x, int y) -> bool { return b_[x + y*w]; }; g = [=, &g_](int x, int y) -> int& { return g_[x + y*w]; }; } else { b = [=, &b_](int x,
auto b;
auto g;
if (vertical)
{
b = [=, &b_](int x, int y) -> bool { return b_[x + y*w]; };
g = [=, &g_](int x, int y) -> int& { return g_[x + y*w]; };
}
else
{
b = [=, &b_](int x, int y) -> bool { return b_[y + x*w]; };
g = [=, &g_](int x, int y) -> int& { return g_[y + x*w]; };
}
autob代码>和autog
需要初始化,以便编译器能够确定它们的类型(但我想您知道这一点)
因为您似乎不介意类型的细节(您已经声明了它们auto
)
std::函数b;
std::函数g;
应该可以做到这一点。之所以没有编译,是因为不正确地使用了auto
。通过稍微更改lambda的定义,可以完全避免条件创建lambda:
int mx = vertical ? 1 : w;
int my = vertical ? w : 1;
auto b = [=, &b_](int x, int y) -> bool { return b_[mx*x + my*y]; };
auto g = [=, &g_](int x, int y) -> int& { return g_[mx*x + my*y]; };
其思想是有条件地设置乘法器mx
和my
。这允许您无条件地构造lambda,这样您就可以在声明中使用auto
。声明b
和g
作为std::function
对象?这是一个很好的解决方案。我在代码中使用了您的解决方案,但是给了另一个答案打勾,因为这是一个仅适用于此特定示例的解决方案(尽管是一个很好的解决方案)。谢谢重复?在声明或计算中?声明。也就是说,我必须在心里把(intx,inty)->int&
转换成int&(int,int)
。好吧,我想这没那么糟糕,这大概是C++11所能做的最好的了,但我觉得我可能缺少了一个更优雅的方法。
int mx = vertical ? 1 : w;
int my = vertical ? w : 1;
auto b = [=, &b_](int x, int y) -> bool { return b_[mx*x + my*y]; };
auto g = [=, &g_](int x, int y) -> int& { return g_[mx*x + my*y]; };