ฉันจะนับจำนวนอาร์กิวเมนต์ของฟังก์ชันเทมเพลตตัวแปรได้อย่างไร
กล่าวคือ:
template<typename... T>
void f(const T&... t)
{
int n = number_of_args(t);
...
}
วิธีใดที่ดีที่สุดในการนำไปใช้number_of_args
ในข้างต้น
ฉันจะนับจำนวนอาร์กิวเมนต์ของฟังก์ชันเทมเพลตตัวแปรได้อย่างไร
กล่าวคือ:
template<typename... T>
void f(const T&... t)
{
int n = number_of_args(t);
...
}
วิธีใดที่ดีที่สุดในการนำไปใช้number_of_args
ในข้างต้น
คำตอบ:
เพียงเขียนสิ่งนี้:
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 (และใหม่กว่า) การคำนวณผลรวมของขนาดของประเภทนั้นง่ายกว่ามากโดยใช้นิพจน์พับ :
constexpr auto size = (sizeof(T) + ...);
หวังว่าจะช่วยได้
sizeof...
และconstexpr
. :)
sizeof...
จะส่งคืนจำนวนอาร์กิวเมนต์จริง ๆ และไม่ใช่ขนาดพื้นที่เก็บข้อมูลรวมของอาร์กิวเมนต์ทั้งหมด (เช่นเดียวsizeof
กับอาร์เรย์)?
sizeof ...(T)
ผลตอบแทนจำนวนT
ชนิดบรรจุใน หากคุณต้องการคำนวณขนาดรวมของประเภทแพ็กเกจคุณต้องทำสิ่งนี้: ideone.com/udggBk ฉันได้เพิ่มสิ่งนี้ไว้ในคำตอบของฉันด้วย
return (0 + ... + sizeof(t));
sizeof...(T)
.