2013-10-15 2 views
-3

키를 문자열로 사용하여지도를 저장하고 람다를 저장합니다.std :: map에 고유 한 키를 생성합니다.

지금까지

std::map <int, auto> callbackMap 

을 시도 그리고 이미 같은 수의 하나가없는 경우 람다를 넣었습니다. 이것이 가능한가 ? 함수가 자동으로 생성자를 가질 수 없다는 오류가 계속 발생합니다.

+6

'1', '2', '3'등은 모두 고유 키입니다. 그들은 당신을 도울까요? 그렇지 않다면, 왜? 어떤 문제를 해결하려고합니까? – Nawaz

+0

std :: map은 모든 키에 대해 하나의 값만 허용하므로'0'에서 시작하여 증가합니까? – Smash

+2

질문이 명확하지 않습니다. 내가 downvotes 얻을 전에 그것을 reformulate 것을 권 해드립니다 ... –

답변

2

왜냐하면 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) 여기에,하지만 당신은 물론 당신이 원하는 방식을 정의 할 수 있습니다) 여전히 기능의 서명을 알아야 할주의 사항 ....

"기능에 대한 포인터"를 저장하기로 결정하면 같은 문제가 발생합니다. 서명을 알아야 해! 다른 것은 없습니다.

+0

거기에 일반적인 람다를 저장할 수있는 방법, 내 원래의 솔루션은 모든 람다에 대한 정적 회원을 가지고하는 것이었지만 나는 매우 잘못 느낀다. –

+0

언제나'void *'을 시도 할 수는 있지만 분명히 자신 만의 메모리를 관리해야합니다. 모든 lambdas가 동일한 호출 규칙을 가지고 있지 않으면, 두 인수가 모두 인수됩니다. 이 대답은 원래 말한 것처럼'std :: function <> '을 사용할 수 있습니다. –

+0

"일반 람다를 저장할 방법이 있습니까?" 나는 대답을 편집 했으니 다시 읽어 보시기 바랍니다. 나는 그것이 당신을 돕기를 바란다! –

관련 문제