Với C ++ 17, bạn có thể có được điều này mà không cần lập trình siêu mẫu khuôn mẫu, sử dụng các biểu thức gấp:
#include <iostream>
#include <type_traits>
template<class... T>
struct TotalSizeOf: std::integral_constant<std::size_t, (0 + ... + sizeof(T))> {};
int main()
{
std::cout << TotalSizeOf< int, char>::value << std::endl;
std::cout << TotalSizeOf< char>::value << std::endl;
std::cout << TotalSizeOf< >::value << std::endl;
}
Điều này cũng sẽ hiệu quả hơn khi biên dịch (tất nhiên trong thời gian chạy, đây là như nhau).
PS: Chỉ cần đọc, rằng bạn chỉ có C ++ 14, nhưng sẽ để điều này đứng ở đây, vì tôi nghĩ thật tuyệt khi thấy rằng chúng ta ít bị buộc phải làm TMP khó xử trong các phiên bản C ++ mới hơn.
Phụ lục: Ít thanh lịch hơn C ++ 17, nhưng C ++ 14 và khá nhiều tmp-free
#include <iostream>
#include <type_traits>
#include <initializer_list>
constexpr size_t sum(std::initializer_list<size_t> arr) {
// Accumulate is sadly not constexpr in C++14
auto ret = 0ul;
for(auto i: arr) {
ret += i;
}
return ret;
}
template<class... T>
struct TotalSizeOf: std::integral_constant<std::size_t, sum({sizeof(T)...})> {};
int main()
{
std::cout << TotalSizeOf< int, char>::value << std::endl;
std::cout << TotalSizeOf< char>::value << std::endl;
std::cout << TotalSizeOf< >::value << std::endl;
}