【发布时间】:2018-09-07 21:03:52
【问题描述】:
我如何编写一个函数来兼容 vanilla 指针类型 (T*) 或 <memory> 中定义的特殊指针类型,例如 std::unique_ptr?
我尝试使用std::is_pointer 检查,但看起来这不是正确的方法:
#include <iostream>
#include <memory>
template<typename T>
void SomePointerFunction(
T p, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr) {
std::cout << (p ? "not null" : "null") << std::endl;
}
int main() {
int* p;
std::unique_ptr<int> q;
SomePointerFunction(p); // If we cange p to q, template matching fails
return 0;
}
是否有某种在 C++ 中定义的通用指针类型可以封装这些不同类型的指针,或者可以实现此目的的不同模板检查?
经过更多思考,我也明白为什么这实际上是该语言的一个不良特性,因为这两种类型的指针在很多方面都非常不同。但是,如果您只想编写一个利用指针的解引用属性的函数,那么这似乎很有用。有没有办法说“这个函数接受一个参数,为此定义了运算符*”?
【问题讨论】:
-
您可能会考虑添加重载
void SomePointerFunction(std::nullptr_t) { SomePointerFunction( static_cast<void*>(nullptr) ); },因为nullptr_t类型在技术上不是指针类型并且不能被取消引用,但通常期望像指针一样工作。 -
这在很多情况下似乎都很合理,谢谢你的建议!
-
你也要处理
std::nullptr_t吗?