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

时间:2018-09-07 21:03:52

标签: c++ templates pointers

如何编写与香草指针类型(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属性的函数,那么这样做可能很有用。有什么办法说“此函数采用一个参数,并为其定义了运算符*”?

1 个答案:

答案 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;
}