C++惯用法: 通过std::decltype来SFINAE掉表达式

07-17 1472阅读

目录

C++惯用法: 通过std::decltype来SFINAE掉表达式
(图片来源网络,侵删)

1.什么是SFINAE

2.SFINAE(替换失败不是错误)

3.通过std::decltype来SFINAE掉表达式


1.什么是SFINAE

        SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去选择那个正确的模板,避免失败。

        SFINAE一般用于函数重载和编译期间类型检查,标准库中很多type traits模板就是通SFINAE来实现的。

        看个具体的例子:

#include 
#include 
using namespace std;
template
struct check_has_member_id
{
    // 仅当T是一个类类型时,“U::*”才是存在的,从而这个泛型函数的实例化才是可行的
    // 否则,就将触发SFINAE
    template
    static void check(decltype(&U::id)){}
    // // 仅当触发SFINAE时,编译器才会“被迫”选择这个版本
    template
    static int check(...){}
    enum {value = std::is_void::value};
};
struct TEST_STRUCT
{
    int rid;
};
struct TEST_STRUCT2
{
    int id;
};
int main()
{
    check_has_member_id t1;
    cout 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]