Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++: виртульный GetType через typeid

29K
19 декабря 2009 года
Ander Skirnir
109 / / 08.06.2009
Требуется написать виртуальную функцию получения type_info.
Нечто вроде:
 
Код:
class Object
{    
    public:            
        virtual const type_info& GetType ()
            { return typeid(this); }
       
        Object () {};
};


Проблема в том, что при виртуальном вызове указатель this будет интерпретироваться как указатель на экземпляр базового класса, в результате чего желаемого эффекта можно добиться только перегружая реализацию в производных классах аналогичным кодом. Можно конечно хранить указатель на type_info, но это слишком большой оверхед. Можно и макрос сделать - но тоже не то: хочется честного решения.
5
19 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Только макросом.

АПД. Кстати, а зачем? type_info уныл совсем, даже возможностей Delphi не предоставляет, не говоря уже об отражении в стиле Java или .NET.
29K
19 декабря 2009 года
Ander Skirnir
109 / / 08.06.2009
Ну, во-первых, он является частью стандарта, во-вторых, я не знаю, что есть лучше - читал только, что даже в Loki ничего прогрессивнее враппера над ним не придумали. Мне это, вообщем-то, для лабы нужно - просто, чтобы делать ветвление-по-типу из указателя на базовый класс, но очень хотел бы узнать о альтернативах (для C++, конечно).
87
19 декабря 2009 года
Kogrom
2.7K / / 02.02.2008
Я задание не понял, потому для начала решу тупо.
...
Понял. Потому тупое решение убрал.
87
19 декабря 2009 года
Kogrom
2.7K / / 02.02.2008
Попытка №2

Код:
struct A
{
    virtual const type_info& GetType()
    {
        return typeid(*this);
    }
};

struct B: public A
{
};


int main()
{
    A *b = new B();
    cout << b->GetType().name() << endl;
    delete b;
   
    b = new A();
    cout << b->GetType().name() << endl;
    delete b;
   
    return 0;
}
5
19 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Ander Skirnir
Мне это, вообщем-то, для лабы нужно - просто, чтобы делать ветвление-по-типу из указателя на базовый класс, но очень хотел бы узнать о альтернативах

Всякие страшные паттерны типа стратегии и прочих изысков не подходят?

29K
19 декабря 2009 года
Ander Skirnir
109 / / 08.06.2009
Kogrom победил - это работает, спасибо :)
Теперь было бы неплохо разобраться, как это возможно :rolleyes:
260
19 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Kogrom
Попытка №2

Код:
struct A
{
    virtual const type_info& GetType()
    {
        return typeid(*this);
    }
};

struct B: public A
{
};


int main()
{
    A *b = new B();
    cout << b->GetType().name() << endl;
    delete b;
   
    b = new A();
    cout << b->GetType().name() << endl;
    delete b;
   
    return 0;
}



Не тронь Будду:D

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог