Con C ++ 17 puede obtener esto sin metaprogramación de plantilla elaborada, utilizando expresiones de plegado
#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;
}
Esto también debería ser más eficiente al compilar (por supuesto, en tiempo de ejecución, son lo mismo).
PD: Acabo de leer que solo tienes C ++ 14, pero dejaré que esto permanezca aquí, ya que creo que es agradable ver que estamos menos obligados a hacer TMP incómodo en las nuevas versiones de C ++.
Anexo: Menos elegante que C ++ 17, pero C ++ 14 y prácticamente libre de 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;
}