(C++) 使用 lambda 作为嵌套函数,甚至用作通用函数

(c++) using lambdas as nested functions, or even as general functions?

本文关键字:函数 C++ 使用 lambda 嵌套      更新时间:2023-10-16
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);

编辑:将"转到"更改为"继续">

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

通过多次以这种方式使用 lambda,我想知道使用 lambda 作为函数的完整替代品是一个好主意还是坏主意。Lambda 可以完美地作为更灵活的函数形式,可以嵌套或匿名。如果 lambda 的作用与相同形式的普通函数没有区别,编译器将足够聪明地编译它们,就好像它们是普通函数一样。

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

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

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

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

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

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

这是对嵌套函数的完全充实支持。请记住,未捕获的 lambda 可能会衰减到函数指针。