C에서는 가변 템플릿 인수를 반복하고 호출과 같은 특정 작업을 수행하는 것이 종종 바람직합니다. 기능. 이는 다음 중 하나를 사용하여 달성할 수 있습니다:
(f(args), ...);
그러나 호출된 함수가 잠재적으로 오버로드된 쉼표 연산자가 있는 객체를 반환하는 경우 다음을 사용해야 합니다.
((void)f(args), ...);
일반적인 접근 방식은 목록 초기화를 활용하고 그 안에서 확장을 수행하는 것입니다.
{ 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&&...) {} }; }
위 내용은 C의 모든 Variadic 템플릿 인수에 대해 함수를 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!