Пространства имён
Варианты
Действия

std::type_info::operator==, std::type_info::operator!=

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
 
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
(1)
bool operator==( const type_info& rhs ) const;
(до C++11)
bool operator==( const type_info& rhs ) const noexcept;
(начиная с C++11)
(до C++23)
constexpr bool operator==( const type_info& rhs ) const noexcept;
(начиная с C++23)
(2)
bool operator!=( const type_info& rhs ) const;
(до C++11)
bool operator!=( const type_info& rhs ) const noexcept;
(начиная с C++11)
(до C++20)

Проверяет, относятся ли объекты к одним и тем же типам.

Оператор != синтезируется из operator==.

(начиная с C++20)

Параметры

rhs информационный объект другого типа для сравнения

Возвращаемое значение

true, если операция сравнения верна, иначе false

Примечание

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_constexpr_typeinfo 202106L (C++23) Constexpr для std::type_info::operator==

Пример

#include <iostream>
#include <typeinfo>
#include <string>
#include <utility>

class person
{
  public:
    explicit person(std::string n) : name_(std::move(n)) {}
    virtual const std::string& name() const{ return name_; }

  private:
    std::string name_;
};

class employee : public person
{
  public:
    employee(std::string n, std::string p)
      : person(std::move(n)), profession_(std::move(p)) {}

    const std::string& profession() const { return profession_; }

  private:
    std::string profession_;
};

void print_info(const person& p)
{
    if(typeid(person) == typeid(p))
    {
        std::cout << p.name() << " не является сотрудником\n";
    }
    else if(typeid(employee) == typeid(p))
    {
        std::cout << p.name() << " является сотрудником ";
        auto& emp = dynamic_cast<const employee&>(p);
        std::cout << ", который работает в отделе " << emp.profession() << '\n';
    }
}

int main()
{
    print_info(employee{"Павел", "Экономика"});
    print_info(person{"Катя"});

#if __cpp_lib_constexpr_typeinfo
    if constexpr (typeid(employee) != typeid(person)) // C++23
        std::cout << "класс `employee` != класс `person`\n";
#endif
}

Возможный вывод:

Павел является сотрудником, который работает в отделе Экономика
Катя не является сотрудником
класс `employee` != класс `person`

Смотрите также

проверяет, предшествует ли указанный тип другому объекту type_info,
в порядке, определённом реализацией, т.е. упорядочивает указанные типы
(public функция-элемент) [править]