Mercurial > lbo > hg > ctmp
view src/describe_type.cc @ 5:9baf70ea6f0d
Implement describe_type
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Wed, 25 Mar 2020 10:46:31 +0100 |
parents | |
children |
line wrap: on
line source
#include <iostream> #include <string> using std::string; template<typename T> struct describe { static const string value; static const string rest; }; template<typename T> const string describe<T>::value = "???"; template<typename T> const string describe<T>::rest = ""; // Basic types #define BASIC_TYPE_DESC(TYP) template<> \ struct describe<TYP> { \ static const string value; \ static const string rest; \ }; \ const string describe<TYP>::value = #TYP; \ const string describe<TYP>::rest = ""; BASIC_TYPE_DESC(char) BASIC_TYPE_DESC(short) BASIC_TYPE_DESC(int) BASIC_TYPE_DESC(unsigned) BASIC_TYPE_DESC(long) BASIC_TYPE_DESC(unsigned long) BASIC_TYPE_DESC(long long) BASIC_TYPE_DESC(unsigned long long) BASIC_TYPE_DESC(float) BASIC_TYPE_DESC(double) #define COMPOUND_REFERENCE_DECL(REF) \ template<typename T> \ struct describe<T REF> { \ static const string value; \ static const string rest; \ }; \ template<typename T> \ const string describe<T REF>::value = #REF; \ template<typename T> \ const string describe<T REF>::rest = describe<T>::rest+describe<T>::value; COMPOUND_REFERENCE_DECL(*); COMPOUND_REFERENCE_DECL(* const); COMPOUND_REFERENCE_DECL(&); COMPOUND_REFERENCE_DECL(&&); COMPOUND_REFERENCE_DECL([]); template<typename T> struct describe<const T> { static const string value; static const string rest; }; template<typename T> const string describe<const T>::value = describe<T>::value; template<typename T> const string describe<const T>::rest = describe<T>::rest+"const "; template<typename R, typename A1> struct describe<R (*)(A1)> { static const string value; static const string rest; }; template<typename R, typename A1> const string describe<R(*)(A1)>::value = describe<R>::rest+describe<R>::value+"(*)("+describe<A1>::rest+describe<A1>::value+")"; template<typename R, typename A1> const string describe<R(*)(A1)>::rest = ""; int main(void) { typedef long long typ[]; std::cout << typeid(typ).name() << " <=> " << describe<typ>::rest+describe<typ>::value << "\n"; return 0; }