    #include <string>
    #include <memory>
    template <class T> struct TInfo;
    template <class T> class MyClass;

    #define TINFO(type)                                \
    template <> struct TInfo<type> {                   \
      static char const* getName() {                   \
        return #type;                                  \
      }                                                \
    };                                                 \
    typedef MyClass<type> type##_Class;                \
    typedef std::unique_ptr<MyClass<type>> type##_UPtr; 
    

    template <class T>
    class MyClass {
    private:
      std::string m_typeName;
    
    public:
      MyClass(std::string objName = "ObjectName") 
        : m_typeName(std::string(TInfo<T>::getName()) + "_" + objName)
      {}
    
      std::string const& getName() {
        return m_typeName;
      }
    };
    
    
    //usage:
    #include <iostream>
    
    TINFO(int);
    int main()
    {
      int_UPtr pi(new int_Class());
      std::cout << pi->getName() << '\n';
    }