C++通用指针函数或模板

Apo*_*ica 2 c++ templates pointers

如何编写一个与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;
}
Run Code Online (Sandbox Code Playgroud)

是否有某种通用指针类型在C++中定义,可以封装这些不同类型的指针,或不同的模板检查,实现这一点?


在考虑了更多之后,我也理解为什么这实际上是语言的一个不受欢迎的特性,因为这两种类型的指针在很多方面都非常不同.但是,如果您只想编写一个利用指针解除引用属性的函数,那么这可能是有用的似乎是合理的.有没有办法说"这个函数需要一个参数,为其*定义运算符"?

tka*_*usl 5

有没有办法说"这个函数接受一个参数,为其定义了运算符*"?

有,只是尝试取消引用它.如果它不起作用,SFINAE开始:

template<typename T, typename = decltype(*std::declval<T>())>
Run Code Online (Sandbox Code Playgroud)

我们使用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;
}
Run Code Online (Sandbox Code Playgroud)