
C++模板元编程
文章平均质量分 85
模板元编程实战
优惠券已抵扣
余额抵扣
还需支付
¥29.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++模板元编程(22)模板元编程基础设施大全
类模板提供了一种方便的方式,用于推导和转换类型,尤其是在模板编程中经常遇到需要解除引用修饰符并进行类型推导的情况下非常有用。是 C++ 标准库中的一个元编程类模板,它用于对类型进行推导和转换。的作用是移除类型的引用修饰符,并执行其他一些类型转换操作。模板可以从传入的数组类型中提取出其元素类型。模板根据以下步骤推导和转换类型。,根据第二个版本的重载,会将。,根据第三个版本的重载,会将。对于数组,将得到数组元素类型;对于函数,将得到函数指针类型;原创 2023-07-03 00:18:51 · 419 阅读 · 0 评论 -
C++模板元编程(21)SFINAE规则引入
这个例子里, 如果 T 没有 定义TYPE, 当没有 sfinae 的时候, 就会直接编译错误, 因为展开的结果不合法, 不过因为现在有 sfinae ,第一个展开发现不合法了不会立刻编译错误, 而是会尝试别的重载展开,当然,如果全部的重载函数都不匹配时,那就会报错了。通过SFINAE,我们能够使得模板匹配更为“精确”,即 使得一些模板函数、模板类在实例化时使用特殊的模板版本,而另外一些则使用通用的版本,这样就大大增加了模板设计使用上的灵活性。我们首先来了解模板元编程的一个基本规则:SFINAE,它是。原创 2023-07-02 18:12:14 · 513 阅读 · 0 评论 -
C++模板元编程(20)std::enable_if源码解读以及应用
再进一步,用户在使用时,false和true可以替换成编译期常量表达式,形成一个编译器的判断,在符合某些条件时编译通过,不符合条件时编译报错,目的是在编译期拦截错误。使用enable_if的诀窍是,作为模板的非类型模板参数使用,使用其默认类型void即可,这样用户不用給该参数传值。这个偏特化版本略有不同,里面定义了类型type,这个type类型就是由模板参数的类型。一个通过返回值,一个通过默认模板参数,都可以实现校验模板参数是整型的功能。利用了偏特化的原理,对模板的第一个参数进行具体化,直接传递true。原创 2023-07-02 21:31:32 · 412 阅读 · 0 评论 -
C++模板元编程(19)变量模板用法与实战
变量模板的定义方式与函数模板或类模板类似,只是它定义的是一个变量。在这个例子中,pi是一个变量模板,它可以用于任何类型T。当你使用pi时,你得到的是一个double类型的π值。同样,pi将给你一个int类型的π值(在这种情况下,它将被截断为3)。变量模板的一个常见用途是定义常量。这个变量模板可以用于任何类型T。当你使用Pi时,你得到的是一个double类型的π值。同样,Pi将给你一个int类型的π值(在这种情况下,它将被截断为3)。转载 2023-07-15 14:03:53 · 887 阅读 · 0 评论 -
C++模板元编程(18)typename的其他用法
在c++ Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template……在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:te原创 2021-04-04 16:37:02 · 3642 阅读 · 2 评论 -
C++模板元编程(17)成员函数模板和模板类的继承
模板类的继承包括四种:1.普通类继承模板类大家要区分模板类和类模板的概念,模板类是类模板具体化后得到的类。template<class T>class Base {public: Base(T data) : data_(data) {}private: T data_;};class Derived: public Base<int> {public: Derived(int data) : Base<int>(data) {}原创 2021-04-21 00:16:14 · 3563 阅读 · 2 评论 -
C++模板元编程(16) 类模板的写法
在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢?事实上class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候可以使用下面的方式了:template<原创 2021-01-03 20:11:28 · 2917 阅读 · 3 评论 -
C++模板元编程(14) 函数模板参数和引用叠加的几条规则
在上述代码中,函数模板 foo 接受一个参数为 const T& 类型的引用。在第一个调用中,P 是 const T& 类型,A 是 T& 类型。在上述代码中,函数模板 foo 接受一个参数为 T& 类型的引用。在调用 foo 时,A 需要被替换为所引用的类型,这个很容易理解,引用不会传递,A退化成所引用的类型。当函数模板参数和引用结合时,让人十分头疼,就如果发生化学反应一样,产生意想不到的结果,今天将所有的规则穷举如下。在第二个调用中,P 和 A 都是 const T& 类型,没有额外的调整。原创 2023-08-19 20:49:10 · 254 阅读 · 0 评论 -
C++模板元编程(13) 函数模板和函数重载的相互扯皮
函数模板跟普通函数一样,也可以被重载。C++编译器优先考虑普通函数如果函数模板可以产生一个更好的匹配,那么就选择函数模板// This program uses a function template.#include <iostream>#include <iomanip>using namespace std;// Template definition for square functiontemplate <typename T1,typename原创 2020-12-05 23:02:33 · 16898 阅读 · 0 评论 -
C++模板元编程(12)模板在使用时的一些限制
对于不参与模板参数推断的函数参数(例如,如果相应的模板参数已经明确指定),它们将根据通常的重载解析规则进行隐式转换以匹配对应的函数参数类型。),那么参数就不会参与模板参数推断,而是进行隐式转换以匹配我们指定的类型(在这个例子中,不会发生任何转换,因为类型已经匹配)。同样地,对于转换函数,我们不能明确指定模板参数,因为转换函数的调用通常是隐式的,不需要函数名。总的来说,这些特殊的函数(重载的运算符、转换函数和构造函数)的调用方式使得我们无法明确指定模板参数。在 C++ 中,模板参数通常在函数名后指定,例如。原创 2023-08-19 16:00:45 · 267 阅读 · 0 评论 -
C++模板元编程(11)模板全特化和偏特化
文章目录1、C++模板2、C++模板全特化3、C++模板偏特化4、模板类调用优先级1、C++模板大家都对C++的模板编程应该都能很熟练使用了,下面就是一段很简单不过的例子了//模板函数template<typename T1, typename T2> void func(T1 num1, T2 num2){}//模板类template<typename T1, typename T2> class Test{ void func(T1 a,T2 b)原创 2021-05-15 17:26:11 · 5706 阅读 · 0 评论 -
C++模板元编程(10)模板默认参数
文章目录1.函数模板默认模板参数简介2.函数模板默认模板参数的特点3 函数模板的参数推导规则1.函数模板默认模板参数简介函数模板与类模板在 C++98 一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板不可以。从 C++11 开始,这个限制被解除了,即函数模板同样可以拥有默认模板参数。默认模板参数的用法与函数的默认参数类似,考察如下示例:#include <iostream>using namespace std;//函数默认参数void testFunc(int pa原创 2021-05-14 00:29:37 · 2188 阅读 · 1 评论 -
C++模板元编程(9)模板别名--typedef臭包裹与using的引入
文章目录1、typdef的无奈2、C++引入using定义模板别名1、typdef的无奈在C++98/03里,我们可以通过typedef 关键字定义一个类型的别名,比如 typedef unsigned int uint32;在这里我们定义了unsigned int类型的别名uint32,在以后需要使用unsigned int的时候我们都可以用uint32替换,但是v仅仅是作为unsigned int的一个别名,如下的定义是不合法的:typedef unsigned int uint32;void原创 2021-05-13 22:34:19 · 2186 阅读 · 1 评论 -
C++模板元编程(7)模板参数替换(Template argument substitution)
模板参数替换(Template argument substitution):在函数模板实例化的过程中,模板参数会被替换为实际的参数类型或值。这个替换过程称为模板参数替换。它发生在编译时,根据函数调用时传递的实际参数类型或值来替换函数模板中的模板参数。注意和模板参数推导这个概念区分开来。模板参数推导(Template argument deduction):当我们调用一个函数模板时,编译器会尝试推导出模板参数的具体类型。这个推导过程称为模板参数推导。原创 2023-08-18 00:52:18 · 405 阅读 · 0 评论 -
C++模板元编程(6)函数模板参数推导(Template argument deduction)
参考:https://en.cppreference.com/w/cpp/language/template_argument_deduction。原创 2023-07-15 23:21:04 · 470 阅读 · 0 评论 -
C++模板元编程(5)函数模板参数的获取途径
可以在特定的上下文中显式指定函数模板的模板参数,包括调用函数表达式、函数地址取址、函数引用初始化以及成员函数指针形成等。显式指定(Explicitly Specified): 直接在模板函数调用时指定模板参数。函数模板可以在定义时指定默认的模板参数,如果调用时没有显式指定,将会使用默认值。今天我们来聊聊函数模板参数的获取途径,即模板参数可以通过哪些渠道获得类型。当调用函数时,编译器可以从函数实参中推导出函数模板的模板参数。原创 2023-08-19 14:01:42 · 464 阅读 · 0 评论 -
C++模板元编程(4) 非类型模板参数(Non-type template parameter)
参考:https://en.cppreference.com/w/cpp/language/template_parameters。原创 2021-04-04 15:29:39 · 3182 阅读 · 2 评论 -
C++模板元编程(3)类型模板参数和模板模板参数
前面我们介绍了模板隐式实例化和显示实例化,今天介绍另外一个截然不同的概念,模板具体化。来说说模板遇到的问题,也就是为什么要有模板具体化方法。模板函数自身有一定的局限性。由于其采用对对象类型的泛化处理,导致其在内部实现的细节上无法保证对所有类型的通用性。假设定义了如下结构:struct job { char name[40]; double salary; int floor;};又假设你希望能够交换这两个结构的内容。原来的模板将使用下面的代码来完成交换:temp = a;a = b;原创 2021-04-04 12:22:27 · 3959 阅读 · 2 评论 -
C++模板元编程(2)函数模板实例化-显示与隐式
模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化。模板的实例化分为隐式实例化和显示实例化。对函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用)。对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显示指明模板实参。各个概念请勿混淆。首先定义函数模板:templa原创 2021-04-04 02:00:12 · 4457 阅读 · 3 评论 -
C++模板元编程(1) 函数模板入门
二进制君对排版做了优化,对内容做了校正和批注。重载函数使编程变得方便,或者说使得接口对外变得统一,因为对于执行类似操作的一组函数,只要记住一个函数名称即可。但是,每个函数都必须单独编写。例如,来看以下重载的 square 求平方函数:int square(int number) { return number * number;}double square(double number) { return number * number;}这两个函数之间的唯一区别是它们的返回原创 2020-12-05 21:46:10 · 3883 阅读 · 2 评论 -
C++模板元编程(0)模板编程与泛型编程
什么是元编程元编程 (metaprogramming) 通过操作 程序实体 (program entity),在 编译时 (compile time) 计算出 运行时 (runtime) 需要的常数、类型、代码的方法。一般的编程是通过直接编写 程序 (program),通过编译器 编译 (compile),产生目标代码,并用于 运行时 执行。与普通的编程不同,元编程则是借助语言提供的 模板 (template) 机制,通过编译器 推导 (deduce),在 编译时 生成程序。元编程经过编译器推导得到的程原创 2021-04-04 22:03:37 · 3980 阅读 · 3 评论