"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 압축된 Variadic 템플릿 인수 목록을 간결하게 반복하는 방법은 무엇입니까?

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

2024-11-04에 게시됨
검색:821

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

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

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

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

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

STL 접기 표현식 및 람다를 사용하는 솔루션

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

template 
void Foo (Ts && ... inputs)
{
    int i = 0;

    ([&]
    {
        // Do things in your "loop" lambda

          i;
        std::cout << "input " << i << " = " << inputs << std::endl;

    } (), ...);
}

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

루프 중단 처리를 위한 대안

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

  • try/throw 사용: 이 접근 방식에서는 람다 내에서 예외를 발생시켜 루프를 벗어날 수 있습니다. 그러나 이 방법은 예외 오버헤드로 인해 성능에 큰 영향을 미칠 수 있습니다.
  • 변수/if 스위치: 이 방법에는 루프를 제어하기 위한 변수를 생성하고 루프를 중단하기 위해 if 문을 사용하는 작업이 포함됩니다. 루프. 효과적이기는 하지만 미적으로 덜 만족스러운 코드로 이어질 수 있습니다.
릴리스 선언문 이 글은 1729667291에서 재인쇄되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3