"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++에서 모든 Variadic 템플릿 인수에 대해 함수를 호출하는 방법은 무엇입니까?

C++에서 모든 Variadic 템플릿 인수에 대해 함수를 호출하는 방법은 무엇입니까?

2024년 11월 19일에 게시됨
검색:825

How to Invoke a Function on All Variadic Template Arguments in C  ?

C 가변 템플릿: 모든 템플릿 인수에 대해 함수 호출

C에서는 가변 템플릿 인수를 반복하고 호출과 같은 특정 작업을 수행하는 것이 종종 바람직합니다. 기능. 이는 다음 중 하나를 사용하여 달성할 수 있습니다:

C 17 Fold Expression

(f(args), ...);

그러나 호출된 함수가 잠재적으로 객체를 반환하는 경우 오버로드된 쉼표 연산자를 사용하려면 다음을 사용해야 합니다.

((void)f(args), ...);

Pre-C 17 해결책

일반적인 접근 방식은 목록 초기화를 활용하고 그 안에서 확장을 수행하는 것입니다.

{ print(Args)... }

print()가 void를 반환하므로 , int:

{ (print(Args), 0)... }

를 반환하여 문제를 해결할 수 있습니다. 인수 개수에 따라 팩에 항상 최소한 하나의 요소가 있도록 만들 수 있습니다.

{ 0, (print(Args), 0)... }

이 패턴을 재사용 가능한 매크로:

namespace so {
    using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

오버로드된 쉼표 연산자를 처리하려면 매크로를 수정할 수 있습니다:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \
        ::so::expand_type{ 0, ((PATTERN), void(), 0)... }

불필요한 메모리 할당이 걱정된다면 목록을 지원하는 사용자 정의 유형을 정의할 수 있습니다. 초기화하지만 데이터를 저장하지 않습니다:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&&...) {}
    };
}
최신 튜토리얼 더>

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

Copyright© 2022 湘ICP备2022001581号-3