Decltype и typeid возвращают другой тип

следующая программа

#include <iostream>
#include <memory>

class Base
{
public :
    virtual void print() { std::cout << "from base class\n"; }
};

class Derived : public Base
{
public :
    void print() override { std::cout << "from derived class \n"; }
};

int main()
{
    std::unique_ptr< Base > d = std::make_unique< Derived >();
    std::cout << typeid( *( d.get() ) ).name() << "\n";
    std::cout << typeid( decltype( *( d.get() ) ) ).name() << "\n";
}

первый выводит 7Поставлено но второй выводит 4Base. разве они оба не должны выводить один и тот же тип? (7Доставлено)

Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
1
0
431
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В первом случае используется d напрямую: поскольку d указывает на объект типа Derived. Здесь это фактический (во время выполнения) тип печатаемого объекта.

В случае decltype: используется статический тип выражения. Поскольку d является unique_ptr<Base>, типом d.get() является Base*, и разыменование дает Base.

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

Flaze07 19.05.2018 14:27

Нет, decltype - это конструкция времени компиляции, и выражение не вычисляется.

drRobertz 19.05.2018 14:29

хорошо, тогда ... Думаю, я просто прибегу к dynamic_cast. Это было полезно

Flaze07 19.05.2018 14:32

Другие вопросы по теме

Различия между инициализацией прямого списка и инициализацией списка копирования
Могу ли я использовать объединение и битовое поле для упаковки данных
Использование shared-ptr и unique-ptr для конкретного алгоритма двоичного дерева
C++ 14: Форматирование списка параметров с известными типами в строку с использованием функций в DSL
Разрешение перегрузки для функций шаблона с параметрами, отличными от типа шаблона
Какую структуру данных следует использовать для реализации UPGMA?
Передача аргумента std :: array с размером, ограниченным расширяемым набором размеров
Какой тип данных используется для хранения промежуточных вычислений при выполнении программы на C++?
Объяснение перегрузки оператора
Как именно следует использовать declttype для вывода типа возвращаемого значения функции, которая возвращает экземпляр класса, созданный по шаблону