当前位置: 首页 > news >正文

成品网站w灬源码火龙果住房和规划建设局网站

成品网站w灬源码火龙果,住房和规划建设局网站,模板建站符合哪些工作需求?,备案中心查网站SFINAE 是 C 模板编程中的一个非常重要的技术概念,英文全称是 Substitution Failure Is Not An Error,中文通常翻译为 替换失败不是错误。 首先看一个概念 1、函数模板 函数的传参类型 写法 含义 是否类型检查 是否数量固定 void func(int a) 只能接受一…

SFINAE 是 C++ 模板编程中的一个非常重要的技术概念,英文全称是 Substitution Failure Is Not An Error,中文通常翻译为 替换失败不是错误。

首先看一个概念

1、函数模板

函数的传参类型

写法 含义 是否类型检查 是否数量固定
void func(int a) 只能接受一个 int 参数 ✅ 是 ✅ 是
template void func(T a) 接受任意类型的一个参数 ✅ 是 ✅ 是
void func(…) 接受任意数量和类型的参数(无类型检查)

void func(…);
是一个 接受任意参数、任意数量 的函数,是模板匹配失败后的终极兜底方案,常用于配合 SFINAE 做默认实现。void func(…) 这种写法叫做 C风格的可变参数函数(variadic function)

这个 func(...) 是一个 万能匹配兜底版本:
因为 ... 什么都能接
所以不管什么类型、多少参数,都能进
它就成了 如果上面模板失败了,就自动调用这个的“兜底方案”

2、decltype

decltype 用来获取表达式的类型,它会告诉编译器“这个表达式的类型到底是什么”。
简单来说,decltype(expr) 就是返回 expr 的静态类型(编译时确定的类型),可以用来定义变量类型或模板返回类型等。

int x = 10;
decltype(x) y = 20;  // y 的类型是 int,跟 x 一样int& ref = x;
decltype(ref) ref2 = x;  // ref2 是 int&,引用类型auto z = x + 1;   // auto推断类型
decltype(x + 1) w;  // decltype 也能推断,w 的类型是 int

应用在函数模板上

template<typename T>
auto func(T t) -> decltype(t.foo()) {return t.foo();
}

这行代码的意思是:
函数 func 返回类型是 t.foo() 这个表达式的类型
编译器会根据 t.foo() 的返回类型自动推断 func 的返回类型

编译期确定返回类型
decltype(expr) 在编译阶段就确定 expr 的类型。
它不会在程序运行时去判断。

3、SFINAE

它是一种模板实例化时的编译器机制/规则。而非关键字

SFINAE 就像编译器给模板实例化过程加了一个“容错开关”:
如果替换时成功 → 这个模板有效
替换失败 → 这个模板被跳过,继续找其他模板
全失败 → 报错

如果模板发现这个模板能用,就使用这个模板,如果模板不能用,再找下一个模板,直到找到为止,如果都不能用,最后还有默认模板(不论什么参数,几个参数)都能用

#include <iostream>// 只有有foo成员函数的类型可以调用这个版本
template<typename T>
auto func(T t) -> decltype(t.foo()) {std::cout << "调用了有foo成员函数的版本\n";
}// 默认模板
template<typename T>
void func(...) {std::cout << "调用了默认版本\n";
}struct A {void foo() {}
};struct B {};int main() {A a;B b;func(a);  // 输出: 调用了有foo成员函数的版本func(b);  // 输出: 调用了默认版本
}

func(a):a 有 foo(),第二个模板实例化成功,调用它
func(b):b 没有 foo(),第二个模板实例化失败,编译器自动忽略,调用默认版本

总结
SFINAE 是模板参数替换失败时不报错,而是忽略该模板的一种规则
让我们可以写出“如果满足条件就启用这个模板,否则忽略它”的代码
主要用在复杂的模板重载和类型特征检测中

为什么要用SFINAE?1、实现模板的条件选择(模板重载决策)
通过SFINAE可以根据模板参数的性质,选择不同的模板实现。例如,可以实现某个函数模板只在传入类型满足某种条件时才启用,而不满足时就忽略这个模板,从而达到重载的效果。2、编写更灵活、泛化的代码
SFINAE允许模板编程者在编译期对类型做检测(比如某个类型是否有某个成员函数、是否满足某个接口等),根据检测结果来做不同的代码路径选择。3、避免编译时错误,提高代码健壮性
传统写法如果类型不匹配,编译直接报错。SFINAE让编译器能够尝试多个模板版本,只启用可行的那个,避免无效模板导致编译失败。
http://www.dtcms.com/a/420577.html

相关文章:

  • wordpress上传网站模板wordpress cms
  • MCU模块系统时钟
  • 温州 网站制作wordpress 自动升级
  • memblock-1
  • 云南住房和城乡建设厅网站首页网站建设策划基本流程
  • 深度学习核心技术演进:从函数到 Transformer 架构
  • 圣耀做单网站商城类小程序
  • 仿贴吧的网站网站建设费账务处理
  • 博客网站源码带后台前端电商网站登录界面怎么做
  • 成都网站建设平台郑州建站优化
  • 手机wap网站免费制作中山最好的网站建设公司哪家好
  • 网站阵地建设管理办法微网站建设网站
  • 郑州网站制作哪家便宜租房平台网站开发
  • 详解MySQL中的索引、事务和锁
  • 用cms织梦做网站图文教程网站优化计划
  • [C++项目组件]Etcd的简单介绍和使用
  • 重庆网站排名优化wordpress网页手机版
  • 怎样在手机上做自己的网站不是做有网站都叫狠狠
  • 解锁CRM系统流程优势:重塑企业客户关系管理的核心动能
  • 茂名做网站设计与网站建设案例
  • 文安做网站前端直播网站怎么做
  • 网站建设费可以抵扣么苏州网站建设系统方案
  • 河南省建设教育协会网站首页用asp做的网站有多少
  • 郑州做网站优化地址网站建设播放vr视频教程
  • 广西桂川建设集团网站seo运营招聘
  • JS逆向-代码混淆AST技术抽象语法树Obfuscator混淆还原接口数据节点AI生成
  • 前端开发网站开发wordpress fpm
  • 品牌网站建设怎么样设计深圳网站制作
  • 四川城乡建设官方网站百度网站建设要多少钱
  • 新站seo快速排名 排名58同城app下载安装手机版