fork download
  1. #include <type_traits>
  2.  
  3. template <typename T>
  4. struct pups
  5. {
  6. struct inner
  7. {
  8. using outer = pups<T>;
  9. };
  10. };
  11.  
  12. template <typename T, typename = int>
  13. struct is_pups : std::false_type {};
  14.  
  15. template <typename T>
  16. struct is_pups<pups<T>, int> : std::true_type {};
  17.  
  18. template <typename T>
  19. struct is_pups<T, decltype(std::declval<typename T::outer>(), int())> : is_pups<typename T::outer> {};
  20.  
  21. static_assert(is_pups<pups<float>>::value, "foo");
  22. static_assert(is_pups<pups<float>::inner>::value, "foo");
  23. static_assert(!is_pups<float>::value, "foo");
  24.  
  25. struct inner
  26. {
  27. using outer = float;
  28. };
  29.  
  30. static_assert(!is_pups<inner>::value, "foo");
  31.  
  32. int main() {}
Success #stdin #stdout 0s 3336KB
stdin
Standard input is empty
stdout
Standard output is empty