fork download
  1. #include <iostream>
  2. #include <tuple>
  3. #include <type_traits>
  4.  
  5. struct non_pod {
  6. non_pod() {}
  7.  
  8. std::size_t size() const {
  9. return 100;
  10. }
  11.  
  12. private:
  13. int x;
  14. };
  15.  
  16. /* sizeof POD type */
  17. template<std::size_t I = 0, typename... Tp>
  18. typename std::enable_if<std::is_pod<typename std::tuple_element<I, std::tuple<Tp...>>::type>::value, int>::type
  19. calculate_size(std::tuple<Tp...>&) {
  20. return sizeof(typename std::tuple_element<I, std::tuple<Tp...>>::type);
  21. }
  22.  
  23. /* sizeof non-pod type, require to implement size method */
  24. template<std::size_t I = 0, typename... Tp>
  25. typename std::enable_if<!std::is_pod<typename std::tuple_element<I, std::tuple<Tp...>>::type>::value, int>::type
  26. calculate_size(std::tuple<Tp...>& t) {
  27. return std::get<I>(t).size();
  28. }
  29.  
  30. template<std::size_t I = 0, typename... Tp>
  31. typename std::enable_if<I == sizeof...(Tp), int>::type
  32. elements_size(std::tuple<Tp...>&) { return 0; }
  33.  
  34. template<std::size_t I = 0, typename... Tp>
  35. typename std::enable_if<I < sizeof...(Tp), int>::type
  36. elements_size(std::tuple<Tp...>& t) {
  37. return calculate_size<I>(t) + elements_size<I + 1, Tp...>(t);
  38. }
  39.  
  40. int main()
  41. {
  42. std::tuple<int, int, char, non_pod> t;
  43. std::cout << elements_size(t) << std::endl;
  44.  
  45. return 0;
  46. }
  47.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
109