何时删除模板实例化比删除非模板重载更好?

Kno*_*abe 21 c++ templates overloading c++11

假设我有一个与原始指针一起使用的模板:

template<typename T>
void processPointer(T* ptr);
Run Code Online (Sandbox Code Playgroud)

我不希望用void*指针调用它.看来我有两个选择.我可以删除非模板重载:

void processPointer(void*) = delete;
Run Code Online (Sandbox Code Playgroud)

或者我可以删除模板实例化:

template<>
void processPointer<void>(void*) = delete;
Run Code Online (Sandbox Code Playgroud)

声明非模板过载更容易(没有尖角支架).是否有理由我更喜欢删除模板实例化?

Cas*_*sey 19

这是支持模板版本的一个原因:processPointer<void>(void*)仍然可以直接调用,避免其他重载.

  • 明确指定模板参数的+1在通用代码中非常常见. (3认同)

Lig*_*ica 4

我不认为有任何理由在这里进行模板化

事实上,通过删除非模板重载,您可能会摆脱一些我现在无法想到的边缘情况模糊调用,因为非模板优先于模板实例化。从而使这项工作在大多数情况下都能按预期进行。