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)
无法编译的原因是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)
我们的想法是一套乘法器mx和my条件。这使您可以无条件地构造 lambda,以便您可以auto在声明中使用。
在auto b;和auto g;将需要初始化,这样编译器将能够确定它们的类型(但我想你知道这一点)。
由于您似乎并不介意类型的细节(auto无论如何您已经声明了它们);
std::function<bool(int,int)> b;
std::function<int&(int,int)> g;
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩。