[英]Why can't I create a vector of lambdas (of the same type) in C++11?
我試圖創建一個 lambda 向量,但失敗了:
auto ignore = [&]() { return 10; }; //1
std::vector<decltype(ignore)> v; //2
v.push_back([&]() { return 100; }); //3
直到第 2 行,它編譯良好。 但是第 3 行給出了編譯錯誤:
錯誤:沒有用於調用“std::vector<main()::<lambda()>>::push_back(main()::<lambda()>)”的匹配函數
我不想要函數指針向量或函數對象向量。 然而,封裝真正的lambda 表達式的函數對象向量對我有用。 這可能嗎?
每個 lambda 都有不同的類型——即使它們有相同的簽名。 如果要執行類似操作,則必須使用運行時封裝容器,例如std::function
。
例如:
std::vector<std::function<int()>> functors;
functors.push_back([&] { return 100; });
functors.push_back([&] { return 10; });
所有 lambda 表達式都有不同的類型,即使它們是相同的。 您將不同類型的 lambda(因為它是另一個表達式)推入向量中,這顯然行不通。
一種解決方案是制作一個std::function<int()>
向量。
auto ignore = [&]() { return 10; };
std::vector<std::function<int()>> v;
v.push_back(ignore);
v.push_back([&]() { return 100; });
另一方面,當您沒有捕獲任何內容時,使用[&]
不是一個好主意。
雖然其他人所說的是相關的,但仍然可以聲明和使用 lambda 向量,盡管它不是很有用:
auto lambda = [] { return 10; };
std::vector<decltype(lambda)> vec;
vec.push_back(lambda);
因此,您可以在其中存儲任意數量的 lambda,只要它是lambda
的復制/移動!
如果您的 lambda 是無狀態的,即[](...){...}
,C++11 允許它降級為函數指針。 理論上,一個 C++11 兼容的編譯器將能夠編譯這個:
auto ignore = []() { return 10; }; //1 note misssing & in []!
std::vector<int (*)()> v; //2
v.push_back([]() { return 100; }); //3
您可以使用 lambda 生成函數(使用 Nawaz 建議的修復更新):
#include <vector>
#include <iostream>
int main() {
auto lambda_gen = [] (int i) {return [i](int x){ return i*x;};} ;
using my_lambda = decltype(lambda_gen(1));
std::vector<my_lambda> vec;
for(int i = 0; i < 10; i++) vec.push_back(lambda_gen(i));
int i = 0;
for (auto& lambda : vec){
std::cout << lambda(i) << std::endl;
i++;
}
}
但我認為此時您基本上創建了自己的課程。 否則,如果 lambdas 具有完全不同的 caputres/args 等,您可能必須使用元組。
每個 lambda 都是不同的類型。 您必須使用std::tuple
而不是std::vector
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.