首页 > 解决方案 > 使用模板特化来比较指针引用

问题描述

基于这个 SO answer,我正在尝试类似的东西,但有一个指针:

#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

我可能错过了一些愚蠢的东西。

标签: c++templatestemplate-specialization

解决方案


  1. std::remove_pointer<> 作用于原始指针类型。
  2. 智能指针的类型与引用类型的类层次无关

推荐阅读