c++ - 使用模板特化来比较指针引用
问题描述
基于这个 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
我可能错过了一些愚蠢的东西。
解决方案
- std::remove_pointer<> 作用于原始指针类型。
- 智能指针的类型与引用类型的类层次无关
推荐阅读
- javascript - 使用正则表达式测试一个数字是否出现“x”次
- elasticsearch - 启用 _source 后需要有关索引大小增加的信息
- c++ - 检查组合框列表中的字符串
- sql-server - Jira 服务器插件 - Atlassian PocketKnife - QueryDSL - 使用 executewithKeys() 批量插入不适用于 ORACLE 和 SQL Server
- file - Drupal 8 - 图像字段的上传按钮未显示
- istio - Openshift Istio 应用程序
- python-3.x - 使用 Popen 子进程使用 curl 命令下载文件
- sh - date command not found in shell script
- python - 为什么我的代码不起作用?在匹配之前找到一个单词
- spring - 日志文件零扩展名