(c ++)使用lambdas作为嵌套函数,甚至作为一般函数?

时间:2014-09-12 00:37:39

标签: c++ c++11 lambda

enum { WITH_ZERO };
auto copy_num = [](int n, char target[NUM_LEN]) -> int {
    char temp;
    for (int j = NUM_LEN - 1; j >= 0; j--) {
        if ((temp = n % 10 + '0') == '0') {
            return WITH_ZERO;
        } else {
            target[j] = temp;
            n /= 10;
        }
    }
    return !WITH_ZERO;
};
if (copy_num(i, num_copy) == WITH_ZERO) {
    continue;
}
if (i * 3 > MAX_NUM) {
    continue;
}
copy_num(i * 2, num_double);
copy_num(i * 3, num_triple);

//编辑:将'转到'改为'继续'

以上是我的代码的一部分,它应该显示在什么情况下我更喜欢使用嵌套的lambdas。我可以用宏来实现类似的功能,但是它们确实使我的代码更脏,而使用这种方式的lambdas看起来更干净,没有'\'。这里的'copy_num'函数仅在本地使用,而不是在其他任何地方使用,因此这比将'copy_num'定义为外部的正常函数更具可读性。如果需要,Lambdas也可以方便地捕获外部变量,在这种情况下,我可以减少重复的函数参数,再次使代码更清晰。

通过这种方式多次使用lambdas,我想知道使用lambdas作为函数的完整替代是好是坏。 Lambdas可以很好地工作,作为一种更灵活的函数形式,可以嵌套或匿名。如果lambda所做的事情与同一个表单的正常函数没有什么区别,编译器将足够聪明地编译它们,就好像是普通函数一样。

或许未来的c / c ++通常会允许嵌套函数?

1 个答案:

答案 0 :(得分:1)

我认为这种方法没有任何问题。它肯定比C'ish #define's更安全,\中的节省是我能想到的最小优势。

在lambda支持成熟之前,您可能会看到编译器难以生成“最佳”代码。

  

如果需要,Lambdas也可以方便地捕获外部变量,在这种情况下,我可以减少重复的函数参数,再次使代码更清晰。

是的,一旦在别处需要,lambda + capture可以很容易地迁移到一个保存状态的类,并在其上定义一些操作。

  

或许未来的c / c ++通常会允许嵌套函数?

这个 对嵌套函数的完全支持。请记住,不捕获的lambda会衰减为函数指针。