函数模板参数推导的两个经典应用

C++中的函数模板 之前我们知道的交换两个变量的方法有宏定义、函数,这两种方式都能实现两个变量的交换,但是各有各的优缺点 宏定义: - 优点:代码复用,适合所有的类型 - 缺点:缺少类型检查,宏在预处理阶段就被替换掉,编译器并不知道宏的存在 函数: - 优点:真正的函数调用,编译器对类型进行检查 - 缺点:类型不同需要重复定义函数,代码无法复用 上边两种方式... 阅读详情

  1.       推导数组参数。【可以分别推导出“元素类型”和“数组长度”】

// 模板函数定义
template<int bound, typename T>
void f1( T (&ary)[bound] )
{
     T x;
     for(int i=0; i<bound; i++ )
     {
         x = ary[i];
     }
}
// 带有数组参数的函数模板的使用
     int a[] = {1,2,3,4,5,6};
     f1(a);
l 首先,数组的长度是一个编译期常量,可特化模板参数bound;
l 其次,数组类型已知,可特化模板参数T。
利用这个特性,在给函数传递数组参数时,可以避免多传一个数组长度的参数。
 
2.       类模板参数的隐式推导。【目标是用模板函数创建一个类对象,其间可根据函数的参数类型设定类模板的参数类型。】
// 定义
template<typename T>
class A
{
public:
 A(T a){}
 void fun(){}
};
 
template<typename T>
A<T> makefun( T x)
{
 return A<T>(x);
}
 
//使用
makefun( 1 ).fun();
 
l 函数模板可以推导参数类型;
l 根据此类型可设定类模板的参数类型。
该技术大量应用于STL的函数对象的创建。例如:
template <typename A1, typename A2, typename R>
class PFun2 : public std::binary_function<A1,A2,R> {
 public:
    explicit PFun2( R (*fp)(A1,A2) ) : fp_( fp ) {}
    R operator()( A1 a1, A2 a2 ) const
        { return fp_( a1, a2 ); }
 private:
    R (*fp_)(A1,A2);
};
 
template <typename R, typename A1, typename A2>
inline PFun2<A1,A2,R> makePFun( R (*pf)(A1,A2) )
    { return PFun2<A1,A2,R>(pf); }
//...
std::sort(b, e, makePFun(isGreater)); // much better...
 
C++ 函数模板 默认参数 C++模板函数通过泛型编程极大提升了代码复用性和灵活性。掌握基础语法、特化、类型推导、可变参数及现代C++特性(如Concepts)是高效使用模板的关键。合理应用模板可优化代码结构,但需注意编译开销和可维护性,适时选择模板元编程或constexpr函数。 阅读详情

相关推荐

C++模板元编程(6)函数模板参数推导(Template argument deduction)

参考:https://en.cppreference.com/w/cpp/language/template_argument_deduction。

二进制君 846

详解模板参数推导、引用折叠和完美转发

在前面的2篇博文中,分别介绍了左值右值和右值引用。 本文意在介绍模板参数推导规则、引用折叠和完美转发。 右值引用(准确地说,是万能型引用,即universal reference),模板参数推导规则和引用折叠,这三者的结合,实现了完美转发。本文将依次介绍以上三者。 证明引用、左值引用、右值引用的方法 进入正题之前,我们先介绍一下,如何证明一个变量是引用类型,是左值引用还是右值引用。 有网文使用的是...

FinixLei的专栏 (https://github.com/FinixLei) 2200

模板特化与函数模板参数推导的深入解析

本文深入探讨了C++模板编程中关于模板特化和函数模板参数推导的概念和技巧。通过分析模板特化的规则、函数模板参数的非推导性以及如何处理模板中的类型和参数,揭示了模板编程中一些常见的问题及其解决方法。...

weixin_30021053的博客 443

【C++ 泛型编程 进阶篇】C++模板参数推导的场景分析

在C++中,模板是一种强大的工具,允许我们编写通用的、类型安全的代码。模板参数推导是C++模板机制中的一个核心特性,它允许编译器根据实际的函数调用或对象创建来自动确定模板参数的类型。在本章中,我们将探讨几种常见的模板参数可以被自动推导的场景。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 736

C++中的移动语义与函数模板参数推导

本文深入探讨了C++中的移动语义、函数模板参数推导以及函数的默认和删除机制。移动语义允许在不进行实际复制的情况下转移资源的所有权,这在处理大型数据对象时尤其有用。函数模板参数推导让模板函数能够接受左值和右值参数,这对于编写通用代码非常关键。同时,我们还了解了如何通过声明函数为默认或删除来控制类的行为,特别是在不允许对象复制或移动的场景中。最后,文章介绍了constexpr函数的使用,它允许在编译时...

weixin_34162851的博客 398

OASIS协议标准文档的解读_第一部分

OASIS标准协议的文档的解读。完整原协议的中文翻译和解读。

洋葱的专栏 4903

C++17完整导引-模板特性之类模板参数推导

模板特性之类模板参数推到

西门吹雪 2284

windows版kafka异常java.nio.file.FileSystemException另一个程序正在使用此文件,进程无法访问

环境 现象 原因 解决方法 参考

山水牧羊 3847

模板参数类型推导和完美转发及move、引用折叠

模板实参推断(Template Argument Deduction)的规则比较复杂,首先要知道参数类型和模板参数类型是不同的概念。 注意点; 模板参数T是由PT和模板实参共同决定的 template<typename T> // 尖括号里的T叫模板参数 void f(T x); // 圆括号里的T叫调用参数 // 参数类型(即x的类型)和模板参数类型(即T的类型)是不同的概念 ...

weixin_44537992的博客 670

HFSS学习笔记——Vivaldi天线仿真(一)

Vivaldi 天线HFSS仿真,HFSS中指数曲线绘制及曲面绘制。

and_future的博客 1万+

复现论文《大规模风电场电磁暂态高效建模仿真方法》

本文提出了一种针对大规模风电场电磁暂态(EMT)仿真的高效建模方法。通过三种关键技术实现仿真加速:(1)永磁直驱风电机组一体化等效建模,采用节点导纳矩阵降维将25节点机组简化为4端子电路,仿真速度提升1-3个数量级;(2)基于戴维南/诺顿等效和OpenMP并行计算的风电场整体建模,通过串并联叠加实现节点收缩,30台机组仿真加速近万倍;(3)受控源映射解耦方法提高故障仿真灵活性。复现代码展示了核心算法实现,包括导纳矩阵Schur补降维、多进程并行计算框架以及受控源解耦方法。

huanghm88的专栏 279

模板参数自动推导

转载自https://www.cnblogs.com/zwvista/p/7748363.html目录模板参数自动推导示例自定义类模板中的应用Automatic deduction guides(自动推断向导)模板参数自动推导在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写1std::pair a{1, "a"s}; // C++17而只能写1st...

欧阳海宾 991

ardupilot开发 --- 避障篇

适配ardupilot的雷达避障功能开发,使用低成本雷达思岚科技系列雷达,配置简单,灵敏度高,障碍物检测范围不低于30m。

记录老板的每次pua,分享领导每天的毒鸡汤... 4301

从PTA题目到实战:C++函数模板核心语法、实现与工程应用指南

泛型编程是C++中实现代码复用和类型安全抽象的核心范式,其核心机制是模板。函数模板通过参数化类型,允许同一段算法逻辑处理多种数据类型,其原理是编译器在编译时根据调用处的实际类型进行实例化,生成特化版本的函数代码。这种编译期多态技术能显著提升开发效率,减少代码重复,是实现STL等基础库的基石。在实际工程中,函数模板广泛应用于算法封装、容器操作和通用工具函数等场景,例如实现通用的最大值比较、容器排序或数学运算。本文以一道经典的PTA教学题目为切入点,深入解析函数模板的声明、类型推导、特化等关键语法,并探讨其在混

weixin_34319111的博客 482

ITKMontage---ITK自动拼接模块

本文分享ITK中Remote中的ITKMontage拼接模块,希望对各位小伙伴有所帮助!1. ITKMontage介绍在医疗图像处理过程中,图像拼接有很多用处,比如DR图像的拼接。ITKMontage可以快速稳定的处理数据量较大的拼接图像。强度不均匀性校正配准全局优化融合2. ITKMontage安装ITKMontageITKMontage可脱离ITK进行单独安装,也可在ITK安装时作为模块进行安装。单独安装ITK模块安装在ITK编译时,选择ITKMontage模块。

qq_40041064的博客 450

(02)Cartographer源码无死角解析-(81) ROS栅格地图→服务接收子图、cairo图像绘详解、OccupancyGrid地图发布

疑问1疑问1src/cartographer/cartographer/mapping/2d/probability_grid.cc 文件中的 ProbabilityGrid::DrawToSubmapTexture 函数的 proto::SubmapQuery::Response::SubmapTexture* 示例对象 texture 中texture->mutable_slice_pose() 的含义具体是什么。

江南才尽江南山,年少无知年少狂! 1929

【C++ 函数模板】—— 模板参数推导、实例化策略与编译优化

在 C++ 编程领域,函数模板是强大且迷人的存在,而这篇文章正为您徐徐展开其复杂而精妙的画卷。它没有浮于表面,而是深入到模板参数推导的曲折细节之中,同时将实例化时编译器的神秘行为清晰呈现,助力您逐步构建起对函数模板底层原理的深刻认知。

bite_zwy的博客 5601

STM32 cubeMX配置串口重定向

这篇文章主要讲解什么是串口重定向,为什么要串口串口重定向。使用printf函数和上位机通信是非常的方便的。希望大家都能够掌握。

m0_49476241的博客 4572

C++函数模板的参数推导

在写作泛型函数或代码时,我们可能存在这样的需要:与参数相关的其它类型,比如一个迭代器的值的类型。 本文要向大家展示一个函数模板推导机制使用技法,这个在STL的许多排序算法中广泛使用,当然大家也可能在不小心地使用,这此把它点破,以让大家可以更有意识地去使用这个在大师那里已经轻车熟路的技法。 考虑一个情况,我们在写一个泛型函数,它接受一对迭代器,要做的事就是对这一对迭代器之间的元素进行排序

pinghegood的成长之路,奋斗阶段 767

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++——函数模板的参数推导

<br /> <br />在写作泛型函数或代码时,我们可能存在这样的需要:与参数相关的其它类型,比如一个迭代器的值的类型。<br />本文要向大家展示一个函数模板推导机制使用技法,这个在STL的许多排序算法中广泛使用,当然大家也可能在不小心地使用,这此把它点破,以让大家可以更有意识地去使用这个在大师那里已经轻车熟路的技法。<br />考虑一个情况,我们在写一个泛型函数,它接受一对迭代器,要做的事就是对这一对迭代器之间的元素进行排序,其中将出现这幕:我需要对两个值进行交换。不知道大家有没有写过这样的代码,现在

shineHoo的专栏 5826

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++进阶之模板参数推导:用法实例(三百三十)

本篇目的:C++进阶之模板参数推导:用法实例基本概念模板参数推导是C++中的一种机制,它允许编译器根据函数模板调用时传入的实参自动推导出模板的参数类型。通过模板参数推导,开发者无需显式地指定模板参数类型,编译器根据传入参数的类型自动进行匹配。这一特性使得模板的使用更加简便和灵活,减少了冗余代码的编写。推导规则模板参数推导遵循一定的规则,编译器会根据函数调用时传入的实参类型与模板参数类型的匹配情况来决定模板参数的类型。通常情况下,模板的参数类型是通过传入参数的类型推导出来的。

Android系统攻城狮 2185

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【函数模板】函数模板的类型推导

当函数模板的返回值被指定或与传入的参数的类型一致,那么可以直接调用函数模板,而不需要显式的指定参数。

Antonio915的博客 739

详解函数模板

C++的一种编程思想称为泛型编程,主要利用的技术就是模板。

zhangyubo325的博客 5209

C++函数模板参数推导机制深度解析与实战应用

泛型编程是现代C++的核心范式之一,它通过编写独立于具体类型的代码来提升代码复用性和类型安全性。其核心原理在于编译器在编译期根据调用处的实参类型,通过一套严谨的模板参数推导规则,自动生成特定类型的函数或类实例。这项技术的核心价值在于实现了静态多态,既保证了运行效率,又维护了强类型检查。在实际工程中,它被广泛应用于标准库容器、算法以及需要高度抽象的框架开发。理解模板参数推导的精确规则,特别是编译器为何在推导阶段严格限制隐式类型转换以避免二义性和保障类型安全,是掌握C++模板编程的关键。本文以一道经典的函数模板

weixin_34189116的博客 369

C++自动推导与函数模板

生成函数定义的过程称为。

qq_42757463的博客 648
上一篇: 线程局部存储(TLS)的使用
下一篇: 商业计划书的写法
RocWay007
博客等级 码龄24年 37粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值