今天看到一篇博客介紹使用 Lambda 表達式遞歸計算 n!。使用了 C++14 的 generic lambda,給 Lambda 表達式加了一個模板參數,在函數調用的時候將 Lambda 表達式作為參數傳遞給下一層函數。這種方法每次調用函數的時候都要比常規的函數多傳一個參數。我想起兩年前也用 L ...
今天看到一篇博客介紹使用 Lambda 表達式遞歸計算 n!。使用了 C++14 的 generic lambda,給 Lambda 表達式加了一個模板參數,在函數調用的時候將 Lambda 表達式作為參數傳遞給下一層函數。這種方法每次調用函數的時候都要比常規的函數多傳一個參數。我想起兩年前也用 Lambda 表達式寫過遞歸,利用了引用捕獲和 std::function。以 n! 為例,代碼為:
#include <iostream>
#include <functional>
int main()
{
std::function<int(int)> f = [&f](int n) {
if (n == 0 || n == 1) {
return 1;
}
return n * f(n - 1);
}
std::cout << f(5) << std::endl;
}
這種寫法避免了使用 auto f = [&f](int n)
。如果使用 auto 會造成 f 的類型推導不出來,因為 f 的類型依賴於後面的 Lambda 表達式,而編譯器在編譯 Lambda 表達式時無法確定 f 的類型。藉助 std::function 就可以避免推導 f 的類型。這種寫法看似奇特,其實是合法的,原理與 C 語言的 void *p = &p;
類似。
本文來自博客園,作者:mkckr0,轉載請註明原文鏈接:https://www.cnblogs.com/mkckr0/p/16435867.html