Variadic 템플릿: 반복을 위한 Unraveling Pack 확장
Variadic 템플릿은 C에서 뛰어난 표현력을 제공하지만, 그 영역을 탐험하다 보면 예상치 못한 복잡성이 드러날 수 있습니다. 팩 확장을 사용하여 매개변수 팩을 반복하려고 할 때 이러한 문제 중 하나가 발생합니다. 다음 코드를 고려하십시오.
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); } int main() { foo2(1, 2, 3, "3"); return 0; }
컴파일 시 이 코드는 "'args': 매개변수 팩은 이 컨텍스트에서 확장되어야 합니다."라는 오류가 발생합니다. 문제는 함수 호출에서 매개변수 팩을 직접 확장할 수 없다는 데서 비롯됩니다.
해결책은 이러한 확장을 명시적으로 허용하는 컨텍스트인 Braced-init-list 내에서 팩 확장을 활용하는 데 있습니다. 더미 배열의 초기화 목록 내부에 확장을 배치하여 원하는 동작을 강제할 수 있습니다.
template<typename... Args> static void foo2(Args &&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
이 수정된 코드는 올바른 평가를 보장하기 위한 세심한 접근 방식을 포함합니다.
C 17에서 접기 표현식은 훨씬 더 간결한 솔루션을 제공합니다.
((void) bar(std::forward<Args>(args)), ...); ``` This approach guarantees the desired left-to-right expansion unequivocally.
위 내용은 팩 확장을 사용하여 C에서 매개변수 팩을 어떻게 반복할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!