fork(2) download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <tuple>
  4.  
  5. namespace std {
  6.  
  7. template<typename T>
  8. struct remove_cvref {
  9. using type = std::remove_cv_t<std::remove_reference_t<T>>;
  10. };
  11.  
  12. template<typename T>
  13. using remove_cvref_t = typename remove_cvref<T>::type;
  14.  
  15. }
  16.  
  17. template<typename T, template<typename...> typename U>
  18. struct is_derived_from_template {
  19. template<typename... Ts>
  20. static constexpr std::true_type f(U<Ts...>);
  21. static constexpr std::false_type f(...);
  22. static constexpr bool value{
  23. decltype(f(std::declval<std::remove_cvref_t<T>>()))::value};
  24. };
  25.  
  26. template<typename... Ts>
  27. struct S : std::tuple<Ts...> {
  28. S() = default;
  29. };
  30.  
  31. int main() {
  32.  
  33. S<> s0;
  34. S<int, double> s1;
  35. S<std::tuple<>> s2;
  36.  
  37.  
  38. std::cout << is_derived_from_template<decltype(s0), std::tuple>::value << "\n";
  39. std::cout << is_derived_from_template<decltype(s1), std::tuple>::value << "\n";
  40. std::cout << is_derived_from_template<decltype(s2), std::tuple>::value << "\n";
  41.  
  42. return 0;
  43. }
Success #stdin #stdout 0s 4396KB
stdin
Standard input is empty
stdout
1
1
0