首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候删除模板实例化比删除非模板重载更好?

什么时候删除模板实例化比删除非模板重载更好?
EN

Stack Overflow用户
提问于 2014-01-10 02:21:37
回答 4查看 2.3K关注 0票数 23

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

代码语言:javascript
复制
template<typename T>
void processPointer(T* ptr);

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

代码语言:javascript
复制
void processPointer(void*) = delete;

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

代码语言:javascript
复制
template<>
void processPointer<void>(void*) = delete;

声明非模板重载更容易(不使用尖括号)。我更喜欢删除模板实例化有什么原因吗?

EN

回答 4

Stack Overflow用户

发布于 2014-01-10 02:37:31

支持模板版本的Here's one reasonprocessPointer<void>(void*)仍然可以直接调用,避免了其他重载。

票数 22
EN

Stack Overflow用户

发布于 2014-01-10 02:29:31

我看不出有任何理由在这里使用模板

事实上,通过删除非模板重载,您可以摆脱一些边缘情况下的模糊调用,因为非模板优先于模板实例化。从而在大多数情况下使其按所需的方式工作。

票数 4
EN

Stack Overflow用户

发布于 2014-01-10 02:31:34

这可能会给我们一些洞察力:

代码语言:javascript
复制
#include <iostream>

struct X
{
    template<typename T>
    void processPointer(T* ptr) {
        std::cout << "Template\n";
    }

    // error: explicit specialization in non-namespace scope ‘struct X’
    // template<>
    // void processPointer(void*) = delete;

    // Overload but no specialization
    // This will prevent lookup the specialization outside the class, when no
    // template argument is explicitly given.  However, with an explicit 
    // template argument the specialization is called.
    void processPointer(void*) = delete;
};

// Specialization outside the class body
template<>
void X::processPointer(void* ptr) {
    std::cout << "Specialization\n";
}

int main ()
{
    X x;
    //error: use of deleted function ‘void X::processPointer(void*)’
    //x.processPointer((void*)0);

    // Explicit template argument:
    x.processPointer<void>((void*)0);
}

结论:@Casey的答案成立。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21028144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档