C ++ 11 : 가변 템플릿 함수 매개 변수의 수?


87

가변 템플릿 함수에 대한 인수 개수를 어떻게 구할 수 있습니까?

즉 :

template<typename... T>
void f(const T&... t)
{
    int n = number_of_args(t);

    ...
}

number_of_args위에서 구현하는 가장 좋은 방법은 무엇입니까 ?


28
sizeof...(T).
R. Martinho Fernandes

21
@ R.MartinhoFernandes의 "답변 게시"양식은 페이지 하단에서 몇 인치 더 멀리 떨어져 있습니다. ;)
kay

@ kay-SEisevil 귀하의 의견이 그의 의견보다
Sapphire_Brick

답변:


103

다음과 같이 작성하십시오.

const std::size_t n = sizeof...(T); //you may use `constexpr` instead of `const`

n와 같은 상수 표현식이 필요한 당신이 그것을 사용할 수 있습니다 수단 상수 표현 (즉, 컴파일 타임에 알려진)입니다 :

std::array<int,   n>  a; //array of  n elements
std::array<int, 2*n>  b; //array of (2*n) elements

auto middle = std::get<n/2>(tupleInstance);

패킹 된 유형의 집계 된 크기 ( 팩의 유형 와 반대)를 계산 하려면 다음과 같이해야합니다.

template<std::size_t ...>
struct add_all : std::integral_constant< std::size_t,0 > {};

template<std::size_t X, std::size_t ... Xs>
struct add_all<X,Xs...> : 
  std::integral_constant< std::size_t, X + add_all<Xs...>::value > {};

다음을 수행하십시오.

constexpr auto size = add_all< sizeof(T)... >::value;

C ++ 17 이상에서는 fold 표현식을 사용하여 유형의 크기 합계를 계산하는 것이 훨씬 더 간단 합니다.

constexpr auto size = (sizeof(T) + ...);

도움이되기를 바랍니다.


9
+1 두 가지를 배웠습니다. sizeof...constexpr. :)
Qix-MONICA는

1
그래서 이것은 sizeof...실제로 모든 인수의 결합 된 저장 크기가 아닌 인수의 수를 반환 sizeof합니까 (배열에서 와 같이 )?
panzi

@panzi : 네. sizeof ...(T)에 패킹 된 유형의 를 반환합니다 T. 패킹 된 유형의 집계 된 크기를 계산하려면 다음과 같이해야합니다. ideone.com/udggBk 제 대답에도 이것을 추가했습니다.
Nawaz

@panzi : 내 대답의 계산이 이제 약간 향상되었습니다.
Nawaz 2014 년

2
C ++ 17을 사용하여 개별 arg 유형의 크기를 계산하기 위해 이제 fold 표현식을 사용할 수 있습니다. return (0 + ... + sizeof(t));
P0W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.