2014-12-10 3 views
3

나는 오픈 소스 프로젝트 FeatherKit에 다음 줄을 발견 variadic 템플릿의 각 매개 변수에 대해.실행 기능

내 질문은 두 가지이다 : 정확히, 라인 작업을 수행하는 방법

  1. ? 변수 언 패킹은 어떻게 그 함수가 variadic 템플릿의 각 매개 변수에 대해 실행되도록 허용합니까?

  2. 나는이 라인이 람다로 대체 될 수 있다고 확신한다. 어떻게 선을 람다 식으로 대체 할 수 있습니까?

나는 FeatherKit의 원저자에게 연락했지만 그 당시에는 내 질문에 답변 할 수 없었습니다.

답변

1
  1. 정확히 어떻게 작동합니까? 변수 언 패킹은 어떻게 그 함수가 variadic 템플릿의 각 매개 변수에 대해 실행되도록 허용합니까?

파라미터 팩 확장 그래서 ...

expr(T)... 뒤에 파라미터 팩을 포함하는 일부 패턴은 그 패턴 expr(T)와 팩 확장이며, 파라미터 팩 각 Ti위한 expr(T0), expr(T1), expr(T2), ..., expr(TN)로 확장 .

팩 확장은 인수 목록 또는 이니셜 라이저 목록과 같은 특정 컨텍스트에서만 사용할 수 있습니다.이 경우 각 하위 표현식의 결과는 배열 int _[]의 초기화 목록을 구성하는 데 사용됩니다. 배열은 사용되지 않고 팩 확장을 수행 할 컨텍스트로 이니셜 라이저를 사용할 수 있도록 존재합니다. 각 하위 식의 형식은 (SubscribeToType<Ti>(blah, blah), 0)입니다. 이는 함수 호출의 결과가 무시되고 식의 값이 0임을 의미합니다. 팩 확장을 통해 N 개의 정수가 포함 된 브레이싱 된 -init-list를 생성 할 수 있습니다. 이것이 배열을 초기화하는 데 필요하기 때문입니다.

  1. 나는이 라인이 람다로 대체 될 수 있다고 확신한다. 어떻게 선을 람다 식으로 대체 할 수 있습니까?

왜 하시겠습니까?

람다에서 매우 비슷한 팩 확장이 필요할 수 있으므로 아무 것도 단순화하지 않습니다.

+0

# 2 점을 지적하기 위해 int 배열의 초기화 프로그램을 사용하는 것이 'hack'ish이고 매우 깨끗하지는 않습니다. 나는 param 팩을 반복하는 lambda가 매우 깨끗하고 독자에게 명확 할 것이라고 생각했다. – Frank

+0

팩에 대해 "반복"하시겠습니까?실제로는 람다에게 전달할 수있는 인수 팩이 없다는 것을 명심하십시오. 배열은 hackish하지만 단지 "람다 사용하기"는 더 멋진 솔루션을 제공하지 않습니다 (또는 어떤 솔루션이라도) ;-) –

+0

당신 말이 맞아요, 나는 그저 깨끗한 해결책이 있었음에 틀림 없다고 생각했습니다. 팩의 각 매개 변수에 대한 함수 호출을 실행하는 것을 알지 못했습니다. 나는 이제 안다 :) – Frank