ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 使用std :: enable_if和std :: is_arithmetic作为模板参数进行故障

2019-07-24 10:05:29  阅读:661  来源: 互联网

标签:c templates c14 overloading sfinae


我正在尝试实现一个OutputArchive模板类,它具有模板化函数processImpl().看起来像这样:

template<typename ArchiveType>
class OutputArchive {
    ...

    template<typename Type, typename std::enable_if_t<std::is_arithmetic_v<Type>>> inline
    ArchiveType& processImpl(Type&& type) {
        // Implementation
    }

    template<typename Type, typename = void> inline
    ArchiveType& processImpl(Type&& type) {
        // Implementation
    }
}

这里的想法是,如果我将一个char,int,float等传递给我的processImpl()函数,应该使用第一个重载;然而,事实并非如此.第二次重载似乎总是被使用,我完全不知道我可能做错了什么.我想它确实与我使用std :: enable_if的方式有关

解决方法:

所以要使它工作,你应该使用std :: enable_if 2个案例.
我将展示返回类型的示例,但使用模板参数也可以.

template<typename Type> inline
typename std::enable_if_t<std::is_arithmetic_v<Type>, ArchiveType&> processImpl(Type&& type) {
    // Implementation
}

template<typename Type> inline
typename std::enable_if_t<!std::is_arithmetic_v<Type>, ArchiveType&> processImpl(Type&& type) {
    // Implementation
}

请注意第二种情况中的否定.

但是从C17开始,更好的方法是使用constexpr:

ArchiveType& processImpl(Type&& type) {
    if constexpr(std::is_arithmetic_v<type>) {
        // implementation
    } else {
        // implementation
    }
}

标签:c,templates,c14,overloading,sfinae
来源: https://codeday.me/bug/20190724/1521128.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有