>백엔드 개발 >C++ >압축된 Variadic 템플릿 인수 목록을 간결하게 반복하는 방법은 무엇입니까?

압축된 Variadic 템플릿 인수 목록을 간결하게 반복하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-24 03:28:30994검색

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

패킹된 가변 템플릿 인수 목록을 반복하는 방법

C에서 압축된 가변 템플릿 인수 목록을 반복하는 것은 다음으로 인해 문제가 발생합니다. 인수의 수를 알 수 없고 개별적으로 데이터를 검색할 수 없습니다. 이 문제는 재귀 호출을 방지하는 함수 구성 시 매크로를 사용함으로써 더욱 복잡해집니다.

이 문제를 해결하기 위해 제공된 솔루션은 다양한 유형의 데이터를 보유할 수 있는 사용자 정의 유형인 any를 사용합니다. 이 유형을 가변 템플릿에 전달하면 인수가 모든 객체의 벡터로 확장됩니다. 이후에 특수한 getter 함수(get())를 사용하여 이 벡터의 개별 요소를 검색할 수 있으므로 다양한 유형의 데이터에 대한 반복이 가능합니다.

이 방법으로 작업을 수행하는 동안에는 다음이 필요합니다. foo(arg(1000))와 같은 자세한 함수 호출. 이를 단순화하기 위해 우리는 압축된 가변 템플릿 인수 목록에 대해 보다 간결한 반복 방법이나 std::get()과 동등한 방법을 찾습니다.

STL Fold Expressions 및 Lambda를 사용한 솔루션

C 17 이상의 경우 접기 표현식을 람다 함수와 함께 활용하여 반복을 달성할 수 있습니다. 람다는 카운터 증가 및 현재 인수 인쇄를 포함하여 루프 내에서 임의의 작업을 수행할 수 있습니다.

<code class="cpp">template <class ... Ts>
void Foo (Ts &amp;&amp; ... inputs)
{
    int i = 0;

    ([&amp;]
    {
        // Do things in your &quot;loop&quot; lambda

        ++i;
        std::cout << &quot;input &quot; << i << &quot; = &quot; << inputs << std::endl;

    } (), ...);
}</code>

이 방법은 더욱 간결하고 읽기 쉬운 반복 메커니즘을 제공합니다.

대안 루프 중단 처리

앞서 언급한 솔루션은 작업을 수행하지만 루프 내에서 중단 또는 반환을 구현하는 기능이 부족합니다. 이 문제를 해결하기 위해 다음과 같은 해결 방법을 활용할 수 있습니다.

  • try/throw 사용: 이 접근 방식에서는 람다 내에서 예외를 발생시켜 루프를 벗어날 수 있습니다. 그러나 이 방법은 예외 오버헤드로 인해 성능에 큰 영향을 미칠 수 있습니다.
  • 변수/if 스위치: 이 방법에는 루프를 제어하기 위한 변수를 생성하고 if 문을 사용하여 루프를 중단하는 작업이 포함됩니다. 루프. 효과적이기는 하지만 미적으로 덜 만족스러운 코드로 이어질 수 있습니다.

위 내용은 압축된 Variadic 템플릿 인수 목록을 간결하게 반복하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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