首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模板化类中方法的部分专门化

模板化类中方法的部分专门化
EN

Stack Overflow用户
提问于 2012-04-24 00:31:08
回答 1查看 12.9K关注 0票数 22

给定:

代码语言:javascript
复制
struct A
{
    virtual bool what() = 0;
};

template<typename T, typename Q>
struct B : public A
{
    virtual bool what();
};

我想部分专门化what,如下所示:

代码语言:javascript
复制
template<typename T, typename Q>
bool B<T, Q>::what()
{
    return true;
}

template<typename Q>
bool B<float, Q>::what()
{
    return false;
}

但这似乎是不可能的(是在C++11中吗?)所以我试了试SFINAE:

代码语言:javascript
复制
template<typename T>
typename std::enable_if<std::is_same<T, float>::value, bool>::type B<T>::what()
{
    return true;
}

template<typename T>
typename std::enable_if<!std::is_same<T, float>::value, bool>::type B<T>::what()
{
    return false;
}

所以我找到了this thread,结果是:

代码语言:javascript
复制
template<typename T, typename Q>
struct B : public A
{
    virtual bool what()
    {
        return whatimpl(std::is_same<T, float>());
    }

    bool whatimpl(std::false_type)
    {
        return false;
    }

    bool whatimpl(std::true_type)
    {
        return true;
    }
};

这个最终的解决方案可以工作,但是为什么enable_if技术不能工作呢?我也非常愿意接受我还没有遇到过的更清晰的答案的建议。

我尽可能地简化了我的示例--在我的实际用例中,what()不叫what,实际上做了相当多的工作,我想“专攻”一个用户定义的类型,而不是float

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

https://stackoverflow.com/questions/10284498

复制
相关文章

相似问题

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