현재 템플릿 기능으로 연습하고 있습니다. 변환 알고리즘의 구현을 작성하는 작업이있었습니다. 나는 다음처럼했고, 작동 : 템플릿이있는 람다
template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
while (b != e)
*d++ = p(*b++);
return d;
}
일반과 마찬가지로 것은 내가 지금
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
처럼 명시 적 유형 술어를 호출해야 변환, 나는 C 우연히 ++ 11 주면서이 같은 내 함수를 호출하고 싶었 : 나는 유형 추론 할 질수 컴파일러 오류를받을 수 있나요 그와
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;});
합니다. 이것은 내가 실제로 람다에서 T 타입을 두 번 정의하고 있기 때문에 이해하지 못하는 것입니다.
나는 또한 원래의 변환 기능을 확인했다. 그 다음 그 중 implementation을 확인했는데 전체 함수에 대한 템플릿 클래스로 구현되었습니다. 템플릿을 사용하여 술어를 구현하는 올바른 방법입니까? 이 기능에 대한 포인터, 람다와 함수 객체를 받아
template <class in, class out, class UnaryPredicate>
out stransform(in b, in e, out d, UnaryPredicate p);
:
나는 transform의 구현을 읽은 후에 그렇게 생각했다. 나는 아직도 내가 왜 다른 경우에는 작동하지 않는지 궁금해. – inf
@bamboon 람다는 함수가 아니라 함수 객체이기 때문에 상태를 유지할 수 있기 때문에 추측합니다 (함수가 아니라 클로저). –
캡쳐를 수행하지 않는 람다는 일반 함수 (포인터)로 변환 할 수 있습니다. – spraff