首页 > 编程语言 >C++模板特化,Concept,typename

C++模板特化,Concept,typename

时间:2023-03-19 11:14:18浏览次数:39  
标签:std Concept cout C++ typename template class 模板 特化

typename T,表示T为类型,而不是变量
那,T::A是什么?T可以是我们自己写的类,那T::A就是成员变量或成员函数,另外,T::A还可以是类型,T内定义的类型
所以,编译器需要区分,T::A到底是什么
这个问题又叫做 dependent name,依赖名
A是依赖于T的,而T是模板,所以才有这样的问题
所以,有时候才会看到在使用T::A定义变量时,前面加上了一个typename关键字

要从模板说起
template,T就是一个模板,可以是int,double,float之类的
但T是不是还可能是指针类,引用类?

//接收任意参数
template<typename T>
class A {};

//上面模板类的偏特化,接收的是指针类型,但可以是int double float等多个类型的指针,是个子集
template<typename T>
class A<T *> {};

//另一个偏特化例子
template<typename T>
class A<const T> {};

//全特化
template<>
class A<int> {}

有时候,对于某些类别,比如指针,需要做特殊处理,告诉模板,遇到指针按我写的特别处理,这叫模板特化,与实例化不同,模板遇到不同类别如int,double会实例化

这只是一元模板的情况下,实际上,可能会有多元模板,下面是一个二元模板的例子,模板类,模板函数的偏特化好像有些问题

//模板,接收全集R
template <typename T, typename Allocator_T>
class MyVector {
public:
    MyVector() {
        std::cout << "Normal version." << std::endl;
    }
};

//偏特化,第二个参数特殊指定
template <typename T>//声明模板时第二元省略
class MyVector<T, DefaultAllocator> {//但这里要对第二元进行指定
public:
    MyVector() {
        std::cout << "Partial version." << std::endl;
    }
};

从模板可以接受的类型角度来看,和多元函数一样,可以有多个维度
将模板可以接受的所有类型(组合)看做全集R
模板全特化就是,多元模板每一维都指定,为坐标空间的一个点
模板的偏特化是指对R中的子集(部分类别)进行特殊处理,可以是某些元上偏特化,和偏导数有点像哈
匹配的规则就是,越特化,越优先匹配
全特化>偏特化>R

在C++20版本特性中,有一个Concept就是为了此类问题而生的

template <typename A, typename B>
void f(A a, B b) {
    std::cout << "Normal version." << std::endl;
}

template <typename A, typename B>
requires std::integral<B>//integral意思为完整的,整数
void f(A a, B b) {
    std::cout << "Partial version." << std::endl;
}

使用requres对模板进行了偏特化,要求B为整数类型

标签:std,Concept,cout,C++,typename,template,class,模板,特化
From: https://www.cnblogs.com/lxzbky/p/17232504.html

相关文章

  • 钟楼-c++
    #include<iostream>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intx,y,z,id,data;voidsix(intx,inty,intz){//地基四个6*6正方形空心id......
  • SYNU PTA C++ 第三章实验题
    题目详细内容见PTA,仅提供答案参考。7-7冒泡1#include<iostream>2usingnamespacestd;34voidmerge(int*arr,intleft,intmid,intright)5{6......
  • C++ mutex,lock,unlock,lockguard
    //model/util.h#pragmaonce#include<algorithm>#include<chrono>#include<ctime>#include<fstream>#include<iomanip>#include<iostream>#include<map>......
  • c++钟楼
    #include<iostream>#include<string>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intx,y,z,id,data;voida(){ //正方形 mc.fillBlocks(x,y-1......
  • c++常用STL库及常用函数
    临近各种算法比赛,相信很多人想笔者一样还总是记不住很多函数的用法,特此总结一下常用的STL标准库以及标准函数,希望能够有所帮助。1.输入输出输入输出一般用两个标准库:#i......
  • c++ 影响多线程速度的因素记录
    目录0.序言1.缓存行同步问题/共享数据竞争1.1测试代码1.2测试逻辑1.3测试结果1.4小结2.任务颗粒度过小问题2.1测试代码2.1测试逻辑2.2测试结果2.3小结3.缓存未......
  • C++ class struct
    classandstruct目录前文问题对象与引用引用的传递对象copyshallowcopydepthcopymemcpy(data,a.data,sizeof(T)*n);简单类型复杂类型指针类型的......
  • C++ const的理解
    const​const修饰的变量不能再作为左值,初始化后值不能被修改C和C++const的区别​C语言中const修饰的值是常变量,不是常量,只是不能作为左值被修改voidmain(){......
  • 周六900C++模拟测试2023.3.18
     2023江南万达校区能力测试说明:1、在桌面以自己名字命名(中文名)建立文件夹;2、文件夹中存储每个题目对应的英文题目名.cpp文件; 中文题目名称小L的能量检测......
  • 第十三届蓝桥杯国赛 C++ B 组 J 题——搬砖(AC)
    目录​​1.搬砖​​​​1.题目描述​​​​2.输入格式​​​​3.输出格式​​​​4.样例输入​​​​5.样例输出​​​​6.数据范围​​​​7.原题链接​​​​2.解题思路​......