error c2672: “sort”: 未找到匹配的重载函数_Design Patterns With C++(七)SFINAE与重载解析管理(中)...

63d95444f7b7eab30a76fd55d9e6367f.png

目录:

trick:Hands-On Design Patterns With C++(零)前言​zhuanlan.zhihu.com
115fa7ff4026edb9c3c66558a3b28a3d.png

SFINAE与重载解析管理(上):

trick:Design Patterns With C++(七)SFINAE与重载解析管理(上)​zhuanlan.zhihu.com
115fa7ff4026edb9c3c66558a3b28a3d.png

本章代码:

https://github.com/PacktPublishing/Hands-On-Design-Patterns-with-CPP/tree/master/Chapter07​github.com

SFINAE与重载解析管理(中)

SFINAE: Substitution Failure Is Not An Error 匹配失败不是错误

我们本章将讨论以下几个话题:

  1. 什么是函数重载与重载解析?(见上篇)
  2. 什么是类型演绎和类型匹配?(见上篇)
  3. SFINAE是什么?为什么它对C++来说十分重要?(本文)
  4. 如何使用SFINAE编写复杂的程序?(本文及下一篇文章)

SFINAE是什么?SFINAE 替换失败不是错误

此规则的含义是:类型推断引起的替换失败不会引起整个程序发生错误。此规则对于C++模板方法十分重要,没有SFINAE,就无法编写出很多有效的程序。

考虑如下模板重载,一个是普通指针,一个是成员指针:

template <typename T>
void f(T* i) {
     // 普通指针
    std::cout << "f(T*)" << std::endl;
}

template <typename T>
void f(int T::* p) {
     // 成员指针
    std::cout << "f(T::*)" << std::endl;
}

struct A {
    
    int i;
    int f() {
     return 0; }
};

int main() {
    
    A a;
    f(&a.i); // f(T*)
    f(&A::i); // f(T::*)
}

考虑如下代码:

int i;
f(&i); // f(T*)

上述代码与f(T*)重载方法完全匹配,而与f(T::*)无效,编译器遇到f(T::*)方法发现会导致语法错误,就会静默忽略此重载方法。

SFINAE对于无效类型也没有限制,比如不存在的类成员引用。替换失败有很多方式:

template <size_t N>
void f(char(*)[N % 2] = NULL) {
    
    std::cout << "N=" << N << " is odd" << std::endl;
}

template <size_t N>
void f(char(*)[1 - N % 2] = NULL) {
    
    std::cout << "N=" << N << " is even" << std::endl;
}

int main() {
    
    f<5>(); // N=5 is odd
    f<8>(); // N=8 is even
}

上例中,f(char(*)[N % 2] = NULL)的版本适用于奇数(5 % 2 == 1),f(char(*)[1 - N % 2] = NULL)适用于偶数版本(1 - 8 % 2 = 1)。在调用f重载方法时,两个重载中其中一个会被静默忽略,否则会引起歧义失败。

template<typename T, size_t N = T::N>
void f(T t, char(*)[N % 2] = NULL) {
     
    std::cout << "N=" << N << " is odd" << std::endl; 
}

template<typename T, size_t N = T::N>
void f(T t, char(*)[1 - N % 2] = NULL) {
     
    std::cout << "N=" << N << " is even" << std::endl; 
}

struct A {
    
    enum {
    
        N =
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值