>백엔드 개발 >C++ >팩 확장을 사용하여 C에서 매개변수 팩을 어떻게 반복할 수 있습니까?

팩 확장을 사용하여 C에서 매개변수 팩을 어떻게 반복할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-24 10:59:13459검색

How Can I Iterate Over a Parameter Pack in C   Using Pack Expansion?

Variadic 템플릿: 반복을 위한 Unraveling Pack 확장

Variadic 템플릿은 C에서 뛰어난 표현력을 제공하지만, 그 영역을 탐험하다 보면 예상치 못한 복잡성이 드러날 수 있습니다. 팩 확장을 사용하여 매개변수 팩을 반복하려고 할 때 이러한 문제 중 하나가 발생합니다. 다음 코드를 고려하십시오.

template<typename T>
static void bar(T t) {}

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...);
}

int main()
{
    foo2(1, 2, 3, "3");
    return 0;    
}

컴파일 시 이 코드는 "'args': 매개변수 팩은 이 컨텍스트에서 확장되어야 합니다."라는 오류가 발생합니다. 문제는 함수 호출에서 매개변수 팩을 직접 확장할 수 없다는 데서 비롯됩니다.

해결책은 이러한 확장을 명시적으로 허용하는 컨텍스트인 Braced-init-list 내에서 팩 확장을 활용하는 데 있습니다. 더미 배열의 초기화 목록 내부에 확장을 배치하여 원하는 동작을 강제할 수 있습니다.

template<typename... Args>
static void foo2(Args &amp;&amp;... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}

이 수정된 코드는 올바른 평가를 보장하기 위한 세심한 접근 방식을 포함합니다.

  • 빈 확장 방지: 빈 Args는 길이가 0인 배열이 되며 이는 C에서 불법입니다. 이를 방지하기 위해 배열에 요소가 하나 이상 포함되어 있는지 확인합니다.
  • 완벽한 전달: 완벽한 전달(std::forward)을 사용하여 잠재적인 복사본을 방지하고 잠재적으로 const 한정자를 보존합니다.
  • 반환 유형 중화: bar()의 반환 값을 void로 변환하여 활용합니다. 내장된 쉼표 연산자를 사용하여 왼쪽에서 오른쪽으로 평가합니다.

C 17에서 접기 표현식은 훨씬 더 간결한 솔루션을 제공합니다.

((void) bar(std::forward<Args>(args)), ...);
```

This approach guarantees the desired left-to-right expansion unequivocally.

위 내용은 팩 확장을 사용하여 C에서 매개변수 팩을 어떻게 반복할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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