>백엔드 개발 >C++ >템플릿 매개변수를 명시적으로 지정하지 않고 C에서 람다를 `std::function`으로 변환하려면 어떻게 해야 합니까?

템플릿 매개변수를 명시적으로 지정하지 않고 C에서 람다를 `std::function`으로 변환하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-04 12:58:09812검색

How Can I Convert Lambdas to `std::function` in C   Without Explicitly Specifying Template Parameters?

템플릿을 사용하여 Lambda를 std::function으로 변환

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.