узнать имя идентификатора и typeid объекта или переменной в C ++? - PullRequest
0 голосов
/ 04 января 2012

Я начал изучать C ++ (год назад) главным образом потому, что это универсальный язык IMO, и потому что почти все возможно. но одна вещь не так: например, мы пишем некоторый код внутри объекта (класса), и нам нужно как-то узнать его имя:

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

Что ж, лучший вариант - использовать этот ключ, но это не поможет, потому что это не может вернуть имя?

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

как мы можем получить строку 'thatsMyName' в какой-то универсальной функции или даже шаблоне ??

ДРУГОЙ ПРИМЕР: (пожалуйста, ответьте также)

как мы можем получить typeid некоторого класса?

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

это выглядит забавно, но если у кого-то из вас есть идея, как выполнить подобное задание ...

Большое спасибо.

РЕДАКТИРОВАТЬ: ОК, все говорят, что невозможно получить имя объекта, я узнал, как получить имя:

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: Большое спасибо Fiktik, который ответил на мой второй пример, который нашел способ получить type_info объекта!

Ответы [ 3 ]

3 голосов
/ 04 января 2012

Первое, что вы спрашиваете, невозможно. По крайней мере, не напрямую.

Вы можете создать макрос для объявления переменной, который бы где-то регистрировал ее имя, что-то вроде этого:

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

но это довольно громоздко и не может использоваться везде. Зачем вам вообще эта функциональность?

Вторая вещь должна работать с небольшими изменениями:

class MyType
{
public:
    const type_info& getType()
    {
        return typeid(*this);
    }
};
2 голосов
/ 04 января 2012

Получение «имени идентификатора» объекта не будет работать, поскольку не существует уникального идентификатора для объекта (кроме его адреса, который должен быть получен с помощью &).Неограниченное количество ссылок / указателей может обозначать один и тот же объект;в то же время язык позволяет получать доступ к объектам другими способами, кроме идентификаторов (v[0], где v - это вектор, но не идентификатор).Это касается всех языков программирования, которые я знаю, и я знаю дюжину из них.

Что касается вашего второго вопроса, вы можете вернуть ссылку на std::type_info.

struct Test
{
    // pretty useless method
    std::type_info const &type() const { return typeid(*this); }
};

int main()
{
    Test a;
    std::cout << a.type().name() << "\n";
}
2 голосов
/ 04 января 2012

Зачем вам нужно имя переменной ?То, что вы пытаетесь сделать, невозможно;внутри методов классов имя переменной, используемой для доступа к объекту, неизвестно.

Рассмотрим следующий пример:

Test * myTest = new Test();
Test * myTest2 = myTest;
const char* identifier = myTest2->getMyIdentifierName();

Что должно вернуть getMyIdentifierName()?"MyTest"?"MyTest2"?Совсем ничего, поскольку объект был распределен динамически, и поэтому ни одна переменная не может претендовать на «удержание» объекта?

Если вы просто хотите узнать имя переменной, которую вы используете в настоящее время для ссылки на объект, почему бы просто не использовать для него строковый литерал и передавать его туда, где он вам нужен?Но, похоже, в любом реальном приложении это не имеет смысла.

Если вам нужно имя (то есть уникальный идентификатор) для объекта во время выполнения, вам лучше всего дать классу член name и инициализируйте все, что вам нужно.

...