struct Cleaner <T*> 是什么意思?

时间:2021-02-08 17:50:56

标签: c++

template <typename T> struct Cleaner {
   static void clean ( T x ) { 
   }
};

template <typename T> struct Cleaner<T*> {
   static void clean ( T* x ) {
      if ( x ) { delete x; } 
   }
};

template <typename T> void release ( T x ) { Cleaner<T>::clean ( x ); }

struct Cleaner <T*> 是什么意思?是不是特定的第二个 Cleaner 只能接受指针的类型?这种用法在 C++ 中的术语是什么?

2 个答案:

答案 0 :(得分:0)

首先,您定义了一个名为 Cleaner 的类模板。

其次,您“部分特化”了 T* 的类模板,这样如果 T 是指针类型,它将创建“clean()”的特化版本。

在这种情况下,在编译时,如果 T 是指针类型,则 Cleaner<> 模板将使用第二个模式,而如果 T 是完全限定类型,它将使用原始类型。

答案 1 :(得分:0)

这个想法是为函数 release() 提供两种行为,具体取决于其参数的类型(指针与否)。

我们也可以写两个重载

template <typename T> void release2(T) { }
template <typename T> void release2(T *x) { delete x; }

在您的示例中,区别是在 Cleaner 助手类型的两个版本上完成的(部分专业化,如评论中所述),但想法是相同的。

在 C++17 中我们也可以写一个更简洁的版本

#include <trait_types>

template <typename T> void release3(T x) {
    if constexpr (std::is_pointer<T>::value) {
        delete x;
    }
}

说到用法

int
main()
{
  int i=12;
  int *pi=new int(23);
  release3(i);  // NO delete
  release3(pi); // delete is used
  return 0;
}

请注意,delete 之前的空检查不是必需的(它是在内部完成的,就像 C 中的 free() 一样)。