키를 문자열로 사용하여지도를 저장하고 람다를 저장합니다.std :: map에 고유 한 키를 생성합니다.
지금까지
std::map <int, auto> callbackMap
을 시도 그리고 이미 같은 수의 하나가없는 경우 람다를 넣었습니다. 이것이 가능한가 ? 함수가 자동으로 생성자를 가질 수 없다는 오류가 계속 발생합니다.
키를 문자열로 사용하여지도를 저장하고 람다를 저장합니다.std :: map에 고유 한 키를 생성합니다.
지금까지
std::map <int, auto> callbackMap
을 시도 그리고 이미 같은 수의 하나가없는 경우 람다를 넣었습니다. 이것이 가능한가 ? 함수가 자동으로 생성자를 가질 수 없다는 오류가 계속 발생합니다.
왜냐하면 auto
은 필요한 유형을 매우 정의 된 유형으로 변환하는 컴파일 시간 "기능"이기 때문입니다! 당신은 아마도 "변형"유형으로 그것을 혼동하고있을 것입니다 ... 그것은 이런 식으로 작동하지 않습니다. 그것은 X
을 의미하지 않는다
auto X = 3;
은 "변형"입니다. 그것은가로 변환 컴파일러 같다 :
int X = 3;
그래서, X
매우 정의 유형이 통지있다.
지도에 기능 (람다는)을 저장할 수 있습니다. 아무런 문제가 없습니다. 하지만 귀하의 std::function<...>
은 매우 명확합니다. 예 :
std::map< int, std::function< int(int) > > callbackMap;
callbackMap[ 0 ] = std::function< int(int) >([] (int a) { return a + 1; });
callbackMap[ 1 ] = std::function< int(int) >([] (int a) { return a - 1; });
callbackMap[ 2 ] = std::function< int(int) >([] (int a) { return a * 2; });
callbackMap[ 3 ] = std::function< int(int) >([] (int a) { return a/2; });
(내 예를 int(int a)
여기에,하지만 당신은 물론 당신이 원하는 방식을 정의 할 수 있습니다) 여전히 기능의 서명을 알아야 할주의 사항 ....
"기능에 대한 포인터"를 저장하기로 결정하면 같은 문제가 발생합니다. 서명을 알아야 해! 다른 것은 없습니다.
거기에 일반적인 람다를 저장할 수있는 방법, 내 원래의 솔루션은 모든 람다에 대한 정적 회원을 가지고하는 것이었지만 나는 매우 잘못 느낀다. –
언제나'void *'을 시도 할 수는 있지만 분명히 자신 만의 메모리를 관리해야합니다. 모든 lambdas가 동일한 호출 규칙을 가지고 있지 않으면, 두 인수가 모두 인수됩니다. 이 대답은 원래 말한 것처럼'std :: function <> '을 사용할 수 있습니다. –
"일반 람다를 저장할 방법이 있습니까?" 나는 대답을 편집 했으니 다시 읽어 보시기 바랍니다. 나는 그것이 당신을 돕기를 바란다! –
'1', '2', '3'등은 모두 고유 키입니다. 그들은 당신을 도울까요? 그렇지 않다면, 왜? 어떤 문제를 해결하려고합니까? – Nawaz
std :: map은 모든 키에 대해 하나의 값만 허용하므로'0'에서 시작하여 증가합니까? – Smash
질문이 명확하지 않습니다. 내가 downvotes 얻을 전에 그것을 reformulate 것을 권 해드립니다 ... –