С C ++ 17 вы можете получить это без сложного метапрограммирования шаблона, используя выражения сгиба:
#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;
}
Это также должно быть более эффективным при компиляции (конечно, во время выполнения, это то же самое).
PS: Просто прочитайте, что у вас есть только C ++ 14, но вы оставите это здесь, так как я думаю, что приятно видеть, что мы менее вынуждены делать неловкий TMP в новых версиях C ++.
Приложение: Менее элегантно, чем C ++ 17, но C ++ 14 и практически без tmp
#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;
}