fork download
  1. #include <iomanip>
  2. #include <ios>
  3. #include <iostream>
  4. #include <type_traits>
  5.  
  6. using namespace std;
  7.  
  8. #define NEW_SECTION(title) cout << endl\
  9. << "-------- " << #title << " --------" << endl << endl;
  10.  
  11. #define IS_SAME(...) cout << setw(43)\
  12. << ("is_same<" + string(#__VA_ARGS__) + ">::value")\
  13. << " == " << boolalpha << is_same<__VA_ARGS__>::value << endl
  14.  
  15. typedef char char_t; // Char type
  16. typedef char* char_ptr; // Char pointer
  17. typedef const char* char_const_ptr; // Char const pointer
  18.  
  19. int main() {
  20. IS_SAME( char, char ); // Obviously true
  21. IS_SAME( char, float ); // Obviously false
  22.  
  23. NEW_SECTION(char_t);
  24. IS_SAME( char, char_t ); // true: OK
  25. IS_SAME( const char, char_t ); // false: OK
  26. IS_SAME( char, const char_t ); // false: OK
  27. IS_SAME( const char, const char_t ); // true: OK
  28.  
  29. NEW_SECTION(char_ptr);
  30. IS_SAME( char*, char_ptr ); // true: OK
  31. IS_SAME( const char*, char_ptr ); // false: OK
  32. IS_SAME( char*, const char_ptr ); // false: OK
  33. IS_SAME( const char*, const char_ptr ); // false: Why?
  34. IS_SAME( char* const, char_ptr ); // false: OK
  35. IS_SAME( char* const, const char_ptr ); // true: Why?
  36.  
  37. NEW_SECTION(char_const_ptr);
  38. IS_SAME( char*, char_const_ptr ); // false: OK
  39. IS_SAME( const char*, char_const_ptr ); // true: OK
  40. IS_SAME( char* const, char_const_ptr ); // false: OK
  41. return 0;
  42. }
  43.  
Success #stdin #stdout 0.01s 5440KB
stdin
Standard input is empty
stdout
                 is_same<char, char>::value == true
                is_same<char, float>::value == false

-------- char_t --------

               is_same<char, char_t>::value == true
         is_same<const char, char_t>::value == false
         is_same<char, const char_t>::value == false
   is_same<const char, const char_t>::value == true

-------- char_ptr --------

            is_same<char*, char_ptr>::value == true
      is_same<const char*, char_ptr>::value == false
      is_same<char*, const char_ptr>::value == false
is_same<const char*, const char_ptr>::value == false
      is_same<char* const, char_ptr>::value == false
is_same<char* const, const char_ptr>::value == true

-------- char_const_ptr --------

      is_same<char*, char_const_ptr>::value == false
is_same<const char*, char_const_ptr>::value == true
is_same<char* const, char_const_ptr>::value == false