簡體   English   中英

為什么我不能在 C++11 中創建一個 lambda 向量(相同類型)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM