SHAMELESS COPY [출처에서 승인 됨]
매개 변수 팩은 엄격하게 정의 된 컨텍스트 목록에서만 확장 할 수 있으며 연산자 ,
는 그중 하나가 아닙니다. 즉, pack 확장을 사용하여 operator로 구분 된 일련의 하위 표현식으로 구성된 표현식을 생성 할 수 없습니다 ,
.
경험의 규칙은 "확장은 목록 구분 기호가있는 ,
-분리 된 패턴 목록을 생성 할 수 있습니다 ,
."입니다. 연산자 ,
는 문법적으로 목록을 구성하지 않습니다.
각 인수에 대한 함수를 호출하려면 재귀 (가변 템플릿 프로그래머 상자의 기본 도구)를 사용할 수 있습니다.
#include <utility>
template<typename T>
void foo(T &&t){}
template<typename Arg0, typename Arg1, typename ... Args>
void foo(Arg0 &&arg0, Arg1 &&arg1, Args &&... args){
foo(std::forward<Arg0>(arg0));
foo(std::forward<Arg1>(arg1), std::forward<Args>(args)...);
}
auto main() -> int{
foo(1, 2, 3, "3");
}
복사되지 않은 유용한 정보
이 답변에서 보지 못한 또 다른 것은 &&
지정자 및 std::forward
. C ++에서 &&
지정자는 rvalue-references 또는 범용 참조 중 하나를 의미 할 수 있습니다.
나는 rvalue-references에 들어 가지 않고 가변 템플릿으로 작업하는 누군가에게 설명 할 것입니다. 보편적 인 참조는 신이 보낸 것입니다.
완벽한 전달
std::forward
범용 참조 의 용도 중 하나는 유형을 다른 함수로 완벽하게 전달하는 것입니다.
당신의 예에서 우리가 통과 할 경우, int&
에 foo2
자동으로 강등 될 것입니다 int
때문에 생성의 서명의 foo2
템플릿 공제 후 기능은 다음 앞으로이 원한다면 arg
참조하여 수정하는 것이 다른 기능에, 당신은 (원치 않는 결과를 얻을 것이다 변수는 변경되지 않습니다) foo2
를 전달하여 생성 된 임시에 대한 참조를 전달 int
하기 때문입니다. 이 문제를 해결 하기 위해 변수 (rvalue 또는 lvalue) 에 대한 모든 유형의 참조 를 가져 오는 전달 함수를 지정합니다 . 그런 다음, 우리는 우리가 사용하는 전달 함수에 전달 된 정확한 유형을 통과하는지 확인하기 위해 다음과, 만std::forward
그런 다음 유형의 강등을 허용합니까? 우리는 지금 가장 중요한 시점에 있기 때문입니다.
필요한 경우 범용 참조 및 완벽한 전달 에 대해 자세히 읽어보십시오 . Scott Meyers는 리소스로서 꽤 훌륭합니다.
Args
비어?