Использование специализации шаблона для сравнения ссылок на указатели - PullRequest
3 голосов
/ 05 октября 2019

Исходя из этого SO ответа , я экспериментировал с чем-то похожим, но с указателем:

#include <iostream>

class Bar {
public:
    virtual ~Bar() {}
};

class Foo: Bar {
public:
    Foo() { std::cout << "Foo::Foo()" << std::endl; }
    ~Foo() override { std::cout << "Foo::~Foo()" << std::endl; }
};

class Faz {
public:
    Faz() { std::cout << "Faz::Faz()" << std::endl; }
    ~Faz() { std::cout << "Faz::~Faz()" << std::endl; }
};

template <typename T>
typename std::enable_if<std::is_base_of<Bar, std::remove_pointer<T>>::value>::type
func(char const* type, T) {
    std::cout << type << " is derived from Bar" << std::endl;
}

template <typename T>
typename std::enable_if<!std::is_base_of<Bar, std::remove_pointer<T>>::value>::type
func(char const* type, T) {
    std::cout << type << " is NOT derived from Bar" << std::endl;
}

int main()
{
    func("std::unique_ptr<Foo>",  std::unique_ptr<Foo>());
    func("std::unique_ptr<Faz>",  std::unique_ptr<Faz>());
}

cout:

std::unique_ptr<Foo> is NOT derived from Bar
std::unique_ptr<Faz> is NOT derived from Bar

Почему!std::is_base_of<Bar, type_identity<std::remove_pointer<T>>>::value всегда оценивается как истина? Я предположил (как новичок):

std::unique_ptr<Foo> is derived from Bar
std::unique_ptr<Faz> is NOT derived from Bar

Я, вероятно, упускаю что-то глупое.

1 Ответ

0 голосов
/ 05 октября 2019
  1. std :: remove_pointer <> действует на необработанные типы указателей.
  2. Тип интеллектуального указателя не связан с иерархией классов референтного типа
...