C ++ 11: Değişken Şablon Fonksiyon Parametrelerinin Sayısı?


87

Değişken bir şablon işlevine yönelik bağımsız değişkenlerin sayısını nasıl alabilirim?

yani:

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

    ...
}

number_of_argsYukarıdakileri uygulamanın en iyi yolu nedir ?


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

21
@ R.MartinhoFernandes "Cevabınızı Gönderin" formu sayfanın alt kısmına birkaç inç daha uzundur. ;)
kay

@ kay-SEisevil Yorumunuzun neden ondan daha az olumlu oy aldığını anlamıyorum.
Sapphire_Brick

Yanıtlar:


104

Sadece şunu yaz:

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

Bunun nsabit bir ifade olduğuna dikkat edin (yani derleme zamanında bilinir), bu da onu aşağıdaki gibi sabit ifadenin gerekli olduğu yerlerde kullanabileceğiniz anlamına gelir:

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);

Paketlenmiş türlerin toplam boyutunu hesaplamak istiyorsanız ( paketteki türlerin sayısının aksine ), o zaman aşağıdaki gibi bir şey yapmanız gerektiğini unutmayın:

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 > {};

o zaman şunu yap:

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

C ++ 17'de (ve sonrasında), türlerin boyutlarının toplamını hesaplamak, katlama ifadesi kullanılarak çok daha kolaydır :

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

Umarım yardımcı olur.


9
+1 İki şey öğrendi; sizeof...ve constexpr. :)
Qix - MONICA YANLIŞ

1
Yani bu sizeof...aslında tüm argümanların birleşik depolama boyutunu değil, argüman sayısını döndürür ( sizeofbir dizideki gibi )?
panzi

@panzi: Evet. paketlenmiş türlerin sayısınısizeof ...(T) döndürür . Paketlenmiş türlerin toplam boyutunu hesaplamak istiyorsanız, bunun gibi bir şey yapmanız gerekir: ideone.com/udggBk Bunu da cevabıma ekledim. T
Nawaz

@panzi: Cevabımdaki hesaplama şimdi biraz geliştirildi.
Navaz

2
C ++ 17 ile, bağımsız arg türlerinin boyutunu hesaplamak için artık katlama ifadelerini kullanabiliriz return (0 + ... + sizeof(t));
P0W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.