Bagaimana saya bisa menghitung jumlah argumen ke fungsi template variadic?
yaitu:
template<typename... T>
void f(const T&... t)
{
int n = number_of_args(t);
...
}
Apa cara terbaik untuk menerapkan number_of_argsdi atas?
Bagaimana saya bisa menghitung jumlah argumen ke fungsi template variadic?
yaitu:
template<typename... T>
void f(const T&... t)
{
int n = number_of_args(t);
...
}
Apa cara terbaik untuk menerapkan number_of_argsdi atas?
Jawaban:
Tulis saja ini:
const std::size_t n = sizeof...(T); //you may use `constexpr` instead of `const`
Perhatikan bahwa itu nadalah ekspresi konstan (yaitu dikenal pada waktu kompilasi), yang berarti Anda dapat menggunakannya di mana ekspresi konstan diperlukan, seperti:
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);
Perhatikan bahwa jika Anda ingin menghitung ukuran agregat dari jenis yang dikemas (sebagai lawan dari jumlah jenis dalam paket), maka Anda harus melakukan sesuatu seperti ini:
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 > {};
lalu lakukan ini:
constexpr auto size = add_all< sizeof(T)... >::value;
Di C ++ 17 (dan yang lebih baru), menghitung jumlah ukuran jenis jauh lebih sederhana menggunakan ekspresi lipat :
constexpr auto size = (sizeof(T) + ...);
Semoga membantu.
sizeof...dan constexpr. :)
sizeof...sebenarnya mengembalikan jumlah argumen dan bukan ukuran penyimpanan gabungan dari semua argumen (seperti sizeofpada array akan)?
sizeof ...(T)mengembalikan sejumlah tipe yang dikemas T. Jika Anda ingin menghitung ukuran agregat dari jenis yang dikemas, Anda harus melakukan sesuatu seperti ini: ideone.com/udggBk Saya telah menambahkan ini dalam jawaban saya juga.
return (0 + ... + sizeof(t));
sizeof...(T).