假设你想类型void*
(或简称nullptr
)的参数pointer
传递到您的processPointer
功能,您还需要调用它的专业化为Type
类型。然后,你应该写
processPointer(static_cast<Type>(pointer));
为
void processPointer(void*) = delete;
但
template<>
void processPointer<void>(void*) = delete;
你可以写这更短的代码:
processPointer<Type>(pointer);
所以,两种变体可以是用于不同的情况。
然而,在某些情况下,变体与非模板重载的模拟可能是唯一的方法。 假设有两个参数的函数模板:
template<typename T, typename U>
void processPointer(T* ptr1, U* ptr2);
你不希望它与void*
指针作为第一个参数来调用。函数模板的部分特是不是在C++允许所以这个代码不正确:
template<typename U>
void processPointer<void, U>(void*, U*) = delete;
,您必须使用另外一个:
template<typename U>
void processPointer(void*, U*) = delete;
+1,因为我不知道自己的答案。我想删除模板实例,因为我倾向于将整个重载集合看作模板。我认为在阅读代码时(即遵循最少惊喜的原则),将会更容易理解后来的情况。我不知道是否有技术上的理由来选择这种或那种方式。 – utnapistim