C ++ 11에서 같은 유형의 람다 벡터를 만들 수없는 이유는 무엇입니까?
람다 벡터를 만들려고했지만 실패했습니다.
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 ()>)'호출에 일치하는 함수가 없습니다.
함수 포인터의 벡터 나 함수 객체의 벡터를 원하지 않습니다. 그러나 실제 람다 식 을 캡슐화하는 함수 객체의 벡터는 저에게 효과적입니다. 이게 가능해?
모든 람다는 서명이 동일하더라도 유형이 다릅니다 . 이와 같은 std::function
작업을 수행하려는 경우 와 같이 런타임 캡슐화 컨테이너를 사용해야합니다.
예 :
std::vector<std::function<int()>> functors;
functors.push_back([&] { return 100; });
functors.push_back([&] { return 10; });
모든 람다 식은 문자별로 동일한 경우에도 유형이 다릅니다 . 다른 유형의 람다 (다른 표현식이기 때문에)를 벡터에 밀어 넣고 있는데 분명히 작동하지 않습니다.
한 가지 해결책 은 std::function<int()>
대신 벡터를 만드는 것입니다.
auto ignore = [&]() { return 10; };
std::vector<std::function<int()>> v;
v.push_back(ignore);
v.push_back([&]() { return 100; });
다른 참고로, [&]
아무것도 캡처하지 않을 때 사용하는 것은 좋은 생각 이 아닙니다.
다른 사람들이 말한 내용은 관련이 있지만 람다 벡터를 선언하고 사용할 수는 있지만 그다지 유용하지는 않습니다.
auto lambda = [] { return 10; };
std::vector<decltype(lambda)> vector;
vector.push_back(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
람다 생성 함수를 사용할 수 있습니다 (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++;
}
}
하지만 기본적으로이 시점에서 자신 만의 수업을 만들었다 고 생각합니다. 그렇지 않으면 람다에 완전히 다른 caputres / args 등이 있으면 튜플을 사용해야 할 것입니다.
각 람다는 다른 유형입니다. std::tuple
대신을 사용해야 합니다 std::vector
.
'development' 카테고리의 다른 글
CocoaPods-특정 포드 버전 사용 (0) | 2020.09.20 |
---|---|
Angular를 사용하여 전 세계적으로 401s 처리 (0) | 2020.09.20 |
Celery에서 이미 실행중인 작업을 취소 하시겠습니까? (0) | 2020.09.20 |
관계형 데이터베이스에서 카탈로그와 스키마의 차이점은 무엇입니까? (0) | 2020.09.20 |
부트 스트랩 드롭 다운 버블 오른쪽 정렬 (오른쪽 푸시 아님) (0) | 2020.09.20 |