#include <iomanip>
#include <ios>
#include <iostream>
#include <type_traits>
using namespace std;
#define NEW_SECTION(title) cout << endl\
<< "-------- " << #title << " --------" << endl << endl;
#define IS_SAME(...) cout << setw(43)\
<< ("is_same<" + string(#__VA_ARGS__) + ">::value")\
<< " == " << boolalpha << is_same<__VA_ARGS__>::value << endl
typedef char char_t; // Char type
typedef char* char_ptr; // Char pointer
typedef const char* char_const_ptr; // Char const pointer
int main() {
IS_SAME( char, char ); // Obviously true
IS_SAME( char, float ); // Obviously false
NEW_SECTION(char_t);
IS_SAME( char, char_t ); // true: OK
IS_SAME( const char, char_t ); // false: OK
IS_SAME( char, const char_t ); // false: OK
IS_SAME( const char, const char_t ); // true: OK
NEW_SECTION(char_ptr);
IS_SAME( char*, char_ptr ); // true: OK
IS_SAME( const char*, char_ptr ); // false: OK
IS_SAME( char*, const char_ptr ); // false: OK
IS_SAME( const char*, const char_ptr ); // false: Why?
IS_SAME( char* const, char_ptr ); // false: OK
IS_SAME( char* const, const char_ptr ); // true: Why?
NEW_SECTION(char_const_ptr);
IS_SAME( char*, char_const_ptr ); // false: OK
IS_SAME( const char*, char_const_ptr ); // true: OK
IS_SAME( char* const, char_const_ptr ); // false: OK
return 0;
}
I2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxpb3M+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgTkVXX1NFQ1RJT04odGl0bGUpIGNvdXQgPDwgZW5kbFwKCTw8ICItLS0tLS0tLSAiIDw8ICN0aXRsZSA8PCAiIC0tLS0tLS0tIiA8PCBlbmRsIDw8IGVuZGw7CgojZGVmaW5lIElTX1NBTUUoLi4uKSBjb3V0IDw8IHNldHcoNDMpXAoJPDwgKCJpc19zYW1lPCIgKyBzdHJpbmcoI19fVkFfQVJHU19fKSArICI+Ojp2YWx1ZSIpXAoJPDwgIiA9PSAiIDw8IGJvb2xhbHBoYSA8PCBpc19zYW1lPF9fVkFfQVJHU19fPjo6dmFsdWUgPDwgZW5kbAoKdHlwZWRlZiBjaGFyIGNoYXJfdDsgLy8gQ2hhciB0eXBlCnR5cGVkZWYgY2hhciogY2hhcl9wdHI7IC8vIENoYXIgcG9pbnRlcgp0eXBlZGVmIGNvbnN0IGNoYXIqIGNoYXJfY29uc3RfcHRyOyAvLyBDaGFyIGNvbnN0IHBvaW50ZXIKCmludCBtYWluKCkgewoJSVNfU0FNRSggY2hhciwgY2hhciApOwkJCQkJLy8gT2J2aW91c2x5IHRydWUKCUlTX1NBTUUoIGNoYXIsIGZsb2F0ICk7CQkJCQkvLyBPYnZpb3VzbHkgZmFsc2UKCglORVdfU0VDVElPTihjaGFyX3QpOwoJSVNfU0FNRSggY2hhciwgY2hhcl90ICk7CQkJCS8vIHRydWU6IE9LCglJU19TQU1FKCBjb25zdCBjaGFyLCBjaGFyX3QgKTsJCQkvLyBmYWxzZTogT0sKCUlTX1NBTUUoIGNoYXIsIGNvbnN0IGNoYXJfdCApOwkJCS8vIGZhbHNlOiBPSwoJSVNfU0FNRSggY29uc3QgY2hhciwgY29uc3QgY2hhcl90ICk7CS8vIHRydWU6IE9LCgoJTkVXX1NFQ1RJT04oY2hhcl9wdHIpOwoJSVNfU0FNRSggY2hhciosIGNoYXJfcHRyICk7CQkJCS8vIHRydWU6IE9LCglJU19TQU1FKCBjb25zdCBjaGFyKiwgY2hhcl9wdHIgKTsJCS8vIGZhbHNlOiBPSwoJSVNfU0FNRSggY2hhciosIGNvbnN0IGNoYXJfcHRyICk7CQkvLyBmYWxzZTogT0sKCUlTX1NBTUUoIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyX3B0ciApOwkvLyBmYWxzZTogV2h5PwoJSVNfU0FNRSggY2hhciogY29uc3QsIGNoYXJfcHRyICk7CQkvLyBmYWxzZTogT0sKCUlTX1NBTUUoIGNoYXIqIGNvbnN0LCBjb25zdCBjaGFyX3B0ciApOwkvLyB0cnVlOiBXaHk/CgoJTkVXX1NFQ1RJT04oY2hhcl9jb25zdF9wdHIpOwoJSVNfU0FNRSggY2hhciosIGNoYXJfY29uc3RfcHRyICk7CQkvLyBmYWxzZTogT0sKCUlTX1NBTUUoIGNvbnN0IGNoYXIqLCBjaGFyX2NvbnN0X3B0ciApOwkvLyB0cnVlOiBPSwoJSVNfU0FNRSggY2hhciogY29uc3QsIGNoYXJfY29uc3RfcHRyICk7CS8vIGZhbHNlOiBPSwoJcmV0dXJuIDA7Cn0K
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