Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11 if else中的lambda函数定义_C++_C++11_Lambda_Auto - Fatal编程技术网

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

C++ 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,

我如何做这样的事情,但以一种编译的方式,希望没有疯狂的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]; };
}

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]; };