如何编写与香草指针类型(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 ++中定义了某种通用指针类型,可以封装这些不同类型的指针,或者可以通过不同的模板检查来实现此目的?
更多地考虑之后,我还理解了为什么这实际上是语言的不受欢迎的功能,因为两种类型的指针在许多方面都非常不同。但是,如果您只想编写一个利用指针的dereferencing属性的函数,那么这样做可能很有用。有什么办法说“此函数采用一个参数,并为其定义了运算符*
”?
答案 0 :(得分:5)
有没有办法说“此函数采用一个参数,为此 运算符*已定义”?
只有尝试对其取消引用。如果无效,则SFINAE会加入:
template<typename T, typename = decltype(*std::declval<T>())>
我们正在使用std::declval
来获取T
,将其取消引用并尝试获取decltype。最终结果将被忽略,我们只需要编译即可,这意味着T
是可引用的。
#include <iostream>
#include <memory>
template<typename T, typename = decltype(*std::declval<T>())>
void SomePointerFunction(
T& p) {
std::cout << (p ? "not null" : "null") << std::endl;
}
int main() {
int* p = nullptr;
std::unique_ptr<int> q;
int i = 0;
SomePointerFunction(p);
SomePointerFunction(q);
//SomePointerFunction(i);
/* Above prints:
main.cpp: In function 'int main()':
main.cpp:16:24: error: no matching function for call to 'SomePointerFunction(int&)'
*/
return 0;
}