首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在部分模板专门化中使用解密类型

在部分模板专门化中使用解密类型
EN

Stack Overflow用户
提问于 2018-09-27 20:39:59
回答 1查看 311关注 0票数 3

具有以下模板和专门化:

代码语言:javascript
复制
template<typename T, typename = void>
struct A {
    void operator()() {
        std::cout << "primary" << std::endl;
    }
};

template<typename T>
struct A<T, decltype(T().f())> {
    void operator()() {
        std::cout << "specialization" << std::endl;
    }
};

像这样使用:

代码语言:javascript
复制
struct X {
    bool f() { return false; }
};

int main()
{
    A<X>()();
    return 0;
}

当您期望选择部分专业化时,主模板将被解析。然而,当更改为:

代码语言:javascript
复制
template<typename T>
struct A<T, typename std::enable_if<std::is_object<decltype(T().f())>::value>::type> {
    void operator()() {
        std::cout << "specialization" << std::endl;
    }
};

选择专业化。为什么在最初的示例中没有选择专门化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-27 20:54:56

您实例化了:

代码语言:javascript
复制
A<X>

它利用默认模板参数成为:

代码语言:javascript
复制
A<X,void>

然而,你的专长是:

代码语言:javascript
复制
template<typename T>
struct A<T, decltype(T().f())>

对于模板参数X,它变成:

代码语言:javascript
复制
struct A<X, decltype(X().f())>

即:

代码语言:javascript
复制
struct A<X, bool>

因此,您的专门化不是正确的选择,因为A<X,bool>没有专门化A<X,void>

如果您希望您的专门化工作于格式良好的T().f()实例,则可以使用C++17的std::void_t

std::void_t将为void计算传递给它的任何格式良好的模板参数。

代码语言:javascript
复制
template<typename T>
struct A<T, std::void_t<decltype(T().f())>> {
    void operator()() {
        std::cout << "specialization" << std::endl;
    }
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52544813

复制
相关文章

相似问题

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