Search code examples
c++classtypeidtypeinfo

find out identifer name and typeid of the object or variable in C++?


I've started learnig C++ (year ago) mostly because it's univerzal language IMO, and beacause almost everything is possible. but one thing isn't so: for example we are writing some code inside an object(class) and we need to find out it's name somehow:

class Test
{
public: const char* getMyIdentiferName()
          {
                // what now??
          }
};

well the best option is to use 'this' keywod but that wouldn't help cos 'this' cant return name?

Test thatsMyName;
const char* = thtsMyName.getMyIdentiferName(); //return string "thatsMyName" how?

how do we get 'thatsMyName' string in in some generic function or even template??

ANOTHER EXAMPLE:(please answer this too)

how do we get typeid of some class?

class MyType
{
public: type_info getType()
     {
          return typeid(this); //that wont work of course :)
     {
};

this looks funny but if any of you have some idea on how to achive similar task...

thanks alot.

EDIT: OK, everybodey say it's impossible to get the name of an object, I found out how to get the name:

class Test
{
    public: string getObjectName()
    {
        string arg = typeid(*this).name();
        arg.erase(arg.begin(), arg.begin() + 5);
        arg.erase(0,1);
        return arg;
    }
};


int main() 
{
    Test thisIsMyName;
    cout << thisIsMyName.getObjectName() << endl;
    cin.ignore();
    return 0;
}

EDIT: Big thanks to Fiktik answering my second example who found the way oon how to get the type_info of the object!


Solution

  • The first thing you are asking is not possible. At least not directly.

    You could create a macro for variable declaration that would register its name somewhere, something like this:

    #define CREATE_VARIABLE(type, name) registerVariable<type>(#name); type name
    

    but this is quite cumbersome and cannot be used everywhere. Why would you even want to have this functionality?

    The second thing should work with only little adjustments:

    class MyType
    {
    public:
        const type_info& getType()
        {
            return typeid(*this);
        }
    };