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++ 中的术语是什么?
答案 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()
一样)。