C에서 템플릿 매개변수를 명시적으로 지정하지 않고 람다를 std::function으로 변환하는 것은 어려운 일입니다. 문제와 해결책을 살펴보겠습니다.
문제 이해
템플릿 매개변수를 지정하지 않고 std::function을 정의하면 컴파일러가 람다 유형을 추론할 수 없습니다. 논쟁. 이는 람다의 유형이 템플릿 인스턴스화 시 컴파일러에 알려지지 않은 매개변수의 유형에 종속되기 때문입니다.
해결책: ID 유형
이 문제를 피하기 위해 템플릿 유형 추론 중에 종속 유형을 무시하는 ID 유형으로 람다를 래핑할 수 있습니다. 예는 다음과 같습니다.
template <typename T> struct identity { typedef T type; }; template <typename... T> void func(typename identity<std::function<void(T...)>>::type f, T... values) { f(values...); }
이 접근 방식을 사용하면 템플릿 매개변수를 명시적으로 지정하지 않고도 func() 함수에 람다를 전달할 수 있습니다.
제한 사항
그러나 이 솔루션에는 제한 사항이 있습니다.
대체 접근 방식
람다가 변수를 캡처하지 않고 템플릿 매개변수를 명시적으로 지정하려는 경우 다음을 사용할 수 있습니다. 접근 방식:
std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
이 방법은 더 간단하며 컴파일 타임에 템플릿 매개변수가 알려진 경우에 잘 작동합니다.
위 내용은 템플릿 매개변수를 명시적으로 지정하지 않고 C에서 람다를 `std::function`으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!