Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102

#include <typeinfo>, что такое typeid()

26.05.2020, 03:07. Показов 4309. Ответов 9

Студворк — интернет-сервис помощи студентам
Добрый день. Объясните пожалуйста, как работает typeid()?

1. Я читал, что бывает так typeid(type) и вот так type(expression), что подразумевается под expression?
2. Нужно ли приводить к какому либо типу type или expression?
3. Что такое conststd::type_info?
4. Что возвращает typeid()?
5. Почему можно вот так typeid().name()?

Будет совсем хорошо, если вы в крастце расскажите, что вообще это за зверь такой.
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.05.2020, 03:07
Ответы с готовыми решениями:

Что такое #, include, что это означает
______

Что такое #include <iomanip>?
что такое #include &lt;iomanip&gt; объясните пожалуйста что это за библиотека и для чего она нужна.

Что это вообще такое и зачем оно надо: #include <файл> и using name space std?
Объясните десятикласснице, что такое заголовочные файлы, зачем они нужны? Что такое пространство имён, область видимости? Как это,...

9
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
26.05.2020, 03:40
1. любое выражение, к примеру, литерал или имя объекта.
2. нет, читать дальше.
3. класс, хранящий информацию о типе данных.
4. объект std::type_info.
5. потому что оператор typeid возвращает объект std::type_info, у которого имеется такой метод.
Это интроспекция (динамическая идентификация данных), позволяющая определить тип данных выражения.

Определение std::typeinfo:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
namespace std
{
  /**
   *  @brief  Part of RTTI.
   *
   *  The @c type_info class describes type information generated by
   *  an implementation.
  */
  class type_info
  {
  public:
    /** Destructor first. Being the first non-inline virtual function, this
     *  controls in which translation unit the vtable is emitted. The
     *  compiler makes use of that information to know where to emit
     *  the runtime-mandated type_info structures in the new-abi.  */
    virtual ~type_info();
 
    /** Returns an @e implementation-defined byte string; this is not
     *  portable between compilers!  */
    const char* name() const
    { return __name[0] == '*' ? __name + 1 : __name; }
 
#if !__GXX_TYPEINFO_EQUALITY_INLINE
    // In old abi, or when weak symbols are not supported, there can
    // be multiple instances of a type_info object for one
    // type. Uniqueness must use the _name value, not object address.
    bool before(const type_info& __arg) const;
    bool operator==(const type_info& __arg) const;
#else
  #if !__GXX_MERGED_TYPEINFO_NAMES
    /** Returns true if @c *this precedes @c __arg in the implementation's
     *  collation order.  */
    // Even with the new abi, on systems that support dlopen
    // we can run into cases where type_info names aren't merged,
    // so we still need to do string comparison.
    bool before(const type_info& __arg) const
    { return (__name[0] == '*' && __arg.__name[0] == '*')
    ? __name < __arg.__name
    : __builtin_strcmp (__name, __arg.__name) < 0; }
 
    bool operator==(const type_info& __arg) const
    {
      return ((__name == __arg.__name)
          || (__name[0] != '*' &&
          __builtin_strcmp (__name, __arg.__name) == 0));
    }
  #else
    // On some targets we can rely on type_info's NTBS being unique,
    // and therefore address comparisons are sufficient.
    bool before(const type_info& __arg) const
    { return __name < __arg.__name; }
 
    bool operator==(const type_info& __arg) const
    { return __name == __arg.__name; }
  #endif
#endif
    bool operator!=(const type_info& __arg) const
    { return !operator==(__arg); }
 
#ifdef __GXX_EXPERIMENTAL_CXX0X__
    size_t hash_code() const noexcept
    {
#  if !__GXX_MERGED_TYPEINFO_NAMES
      return _Hash_bytes(name(), __builtin_strlen(name()),
             static_cast<size_t>(0xc70f6907UL));
#  else
      return reinterpret_cast<size_t>(__name);
#  endif
    }
#endif // __GXX_EXPERIMENTAL_CXX0X__
 
    // Return true if this is a pointer type of some kind
    virtual bool __is_pointer_p() const;
 
    // Return true if this is a function type
    virtual bool __is_function_p() const;
 
    // Try and catch a thrown type. Store an adjusted pointer to the
    // caught type in THR_OBJ. If THR_TYPE is not a pointer type, then
    // THR_OBJ points to the thrown object. If THR_TYPE is a pointer
    // type, then THR_OBJ is the pointer itself. OUTER indicates the
    // number of outer pointers, and whether they were const
    // qualified.
    virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj,
                unsigned __outer) const;
 
    // Internally used during catch matching
    virtual bool __do_upcast(const __cxxabiv1::__class_type_info *__target,
                 void **__obj_ptr) const;
 
  protected:
    const char *__name;
 
    explicit type_info(const char *__n): __name(__n) { }
 
  private:
    /// Assigning type_info is not supported.
    type_info& operator=(const type_info&);
    type_info(const type_info&);
  };
Добавлено через 5 минут
Советую прочитать это и вот это.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
26.05.2020, 15:35  [ТС]
Mightsoul,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void lightParticle::Collied(std::unique_ptr<Particle>& obj) {
    const std::type_info& objType = typeid(obj);
    if (objType == typeid(lightParticle)) {                <-- это не срабатывает
        this->set_VX_VY(obj->getVX(), obj->getVX());
        obj->set_VX_VY(this->getVX(), this->getVX());
        std::cout << "YESSIR!";
    }
    else if (typeid(obj).name() == "heavyParticle") {
        std::cout << "ERROR";
        /* code */
    }
    std::cout << "OHMY"; // <-- это срабатывает
};
В строчке где не срабатывает почему ? Я так понимаю, потому что в objType содержит информаци о std::unique_ptr<Particle>& как о типе, а не о том на что указывает unique_ptr. Если да, подскажите пожалуйста как это исправить?
0
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
26.05.2020, 16:21
Добавлено через 6 минут
Внутри std::unique_ptr<T> определён псевдоним на T (element_type):
C++
1
const std::type_info& objType = typeid(obj.element_type);
Добавлено через 9 минут
C++
1
const std::type_info& objType = typeid(std::unique_ptr<Particle>::element_type);
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
26.05.2020, 16:35  [ТС]
Цитата Сообщение от Mightsoul Посмотреть сообщение
Внутри std::unique_ptr<T> определён псевдоним на T (element_type):
Ого, не знал. А в каком источнике можно смотреть определение unique_str и не только его? Здесь например, такое есть?
https://en.cppreference.com/w/ Я просто не очень хорошо знаю что есть на этом сайте.

Добавлено через 4 минуты
Цитата Сообщение от Mightsoul Посмотреть сообщение
const std::type_info& objType = typeid(obj.element_type);
так это не работает

error: invalid use of ‘using element_type = class Particle’
const std::type_info& objType = typeid(obj.element_type);
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.05.2020, 16:44
Цитата Сообщение от Glbvnts Посмотреть сообщение
так это не работает
Ясное дело, тебе нужно rtti а не ctti
C++
1
2
3
assert(obj);
const std::type_info& objType = typeid(*obj);
if (objType.hash_code() == typeid(lightParticle).hash_code())
Добавлено через 3 минуты
А вообще лучше type_index используй
1
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
26.05.2020, 16:54
Я же исправил:
C++
1
const std::type_info& objType = typeid(std::unique_ptr<Particle>::element_type);
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.05.2020, 16:59
Цитата Сообщение от Mightsoul Посмотреть сообщение
Я же исправил
std::unique_ptr<Particle>::element_type - это compile time идентификатор
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
26.05.2020, 17:32
Цитата Сообщение от Glbvnts Посмотреть сообщение
Здесь например, такое есть?
https://en.cppreference.com/w/
Есть. https://en.cppreference.com/w/... unique_ptr
Пользуйтесь поиском.

Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
objType.hash_code() == typeid(lightParticle).hash_code()
А зачем сравнивать хэшкоды? У type_info же есть собственный оператор сравнения.
1
26.05.2020, 17:51

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
А зачем сравнивать хэшкоды?
Да х.з., осело где то в голове, вот и сравниваю... :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2020, 17:51
Помогаю со студенческими работами здесь

Что такое "bool " и #include <algorithm>? Кто знает , как они работают ?
Вот код: #include &quot;stdafx.h&quot; #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; bool...

Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h>
В типизированном файле записаны названия городов и их численность. Увеличить численность каждого города на 5% (Количество жителей всегда...

Что такое -lNONE/include ?
Компилятор gcc не может найти таинственную папку NONE/include. Проект на основе cmake. Pkg-config при подаче ему cluttermm-1.0 добавляет к...

Что такое jdoc:include?
Что такое jdoc incloude ? и где мне брать его модули ? как он действует ? то есть есть заготовка на , которой написано...

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru