if-else 中的 C++11 lambda 函数定义

Tim*_*mmm 4 c++ lambda auto c++11

我该如何做这样的事情,但以一种可以编译的方式,并且希望没有疯狂的 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, int y) -> bool { return b_[y + x*w]; };
    g = [=, &g_](int x, int y) -> int& { return g_[y + x*w]; };
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 7

无法编译的原因是auto. 您可以通过稍微更改其定义来完全避免有条件地创建 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]; };
Run Code Online (Sandbox Code Playgroud)

我们的想法是一套乘法器mxmy条件。这使您可以无条件地构造 lambda,以便您可以auto在声明中使用。


Nia*_*all 6

auto b;auto g;将需要初始化,这样编译器将能够确定它们的类型(但我想你知道这一点)。

由于您似乎并不介意类型的细节(auto无论如何您已经声明了它们);

std::function<bool(int,int)> b;
std::function<int&(int,int)> g;
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩。