fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <list>
  5. #include <set>
  6. #include <type_traits>
  7. #include<tuple>
  8.  
  9. template <typename> struct prank : std::integral_constant<std::size_t, 0> {};
  10.  
  11. template <template <typename...> class C, typename ...Args>
  12. struct prank<C<Args...>>
  13. : std::integral_constant<
  14. std::size_t,
  15. 1 + prank<typename C<Args...>::value_type>::value> {};
  16.  
  17. template <typename U, typename V>
  18. struct prank<std::pair<U, V>>
  19. : std::integral_constant<std::size_t, 1 + prank<V>::value> {};
  20.  
  21. template <typename... Args>
  22. struct prank<std::tuple<Args...>>
  23. : std::integral_constant<std::size_t, 1> {};
  24.  
  25. template <typename T,typename... Args>
  26. struct prank<std::tuple<T,Args...>>
  27. : std::integral_constant<std::size_t, prank<T>::value+prank<std::tuple<Args...>>::value> {};
  28.  
  29. int main()
  30. {
  31. {
  32. using T = std::vector<std::set<std::list<int>>>;
  33. std::cout << prank<T>::value << "\n";
  34. }
  35. {
  36. using T =std::tuple<std::map<std::list<int>,std::list<int>>,std::list<int>,std::list<int>,std::list<int>>;
  37. std::cout << prank<T>::value << "\n";
  38. }
  39. {
  40. using T = std::vector<std::map<std::list<int>,std::list<int>>>;
  41. std::cout << prank<T>::value << "\n";
  42. }
  43. }
  44.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
3
7
4