fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <list>
  5. #include <complex>
  6. #include <type_traits>
  7. using namespace std;
  8.  
  9. template <class T>
  10. struct is_seq : std::false_type {
  11. };
  12.  
  13. template <class T>
  14. struct is_seq<std::vector<T>> : std::true_type {
  15. };
  16.  
  17. template <class T>
  18. struct is_seq<std::basic_string<T>> : std::true_type {
  19. };
  20.  
  21. template <class T>
  22. struct is_seq<std::list<T>> : std::true_type {
  23. };
  24.  
  25. template <class T>
  26. using enable_if_seq_type = typename std::enable_if<is_seq<T>::value>::type;
  27.  
  28. template <class T>
  29. using enable_if_integral_type = typename std::enable_if<std::is_integral<T>::value>::type;
  30.  
  31.  
  32. template <class T, class Enable = void>
  33. class Compare;
  34.  
  35. template <class T>
  36. class Compare<T, enable_if_seq_type<T>> {
  37. public:
  38. void foo() {
  39. cout << "vector, string and list specialization" << endl;
  40. }
  41. };
  42.  
  43. template <class T>
  44. class Compare<T, enable_if_integral_type<T>> {
  45. public:
  46. void foo() {
  47. cout << "integral specialization" << endl;
  48. }
  49. };
  50.  
  51.  
  52. int main() {
  53. cout << std::boolalpha;
  54.  
  55. cout << is_seq<int>::value << endl;
  56. cout << is_seq<std::vector<int>>::value << endl;
  57.  
  58. Compare<int> c1;
  59. c1.foo();
  60.  
  61. Compare<std::vector<int>> c2;
  62. c2.foo();
  63.  
  64. Compare<std::complex<int>> c3;
  65.  
  66. return 0;
  67. }
Compilation error #stdin compilation error #stdout 0s 3340KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:64:29: error: aggregate ‘Compare<std::complex<int> > c3’ has incomplete type and cannot be defined
  Compare<std::complex<int>> c3;
                             ^
stdout
Standard output is empty