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&&...) {} }; }
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3