c++ templates常用函数

ops/2024/9/25 2:46:30/

说明

c++ templates学习中会遇到大量的模版常用函数,书上不会详细介绍,查看一个之后要永久记录一段时间之后再看看,这里总结一下。

undeclared();

undeclared();//若undeclared();未定义,则在第一阶段编译时报错

undeclared(t);//若t未知,则在第二编译阶段报错

std::decay<T>

在<type_traits>定义,将T类型转换为它的衰变类型。例如去const、去&、去易变性限定符、数组变为*。

#include <type_traits>
#include <iostream>
template<typename T1,typename T2>
auto max(T1 a, T2 b)->typename std::decay<decltype(true ? a : b)>::type
{return a > b ? a : b;
}
template<typename T>
void fun(T&& t)
{//我们希望创建与参数同类型的,而不是引用typedef typename std::decay<T>::type U;U u;//x与t的原始类型相同typename std::decay<T>::type x = t;
}
enum Enuma
{type1,type2
};
class Type{};
void main()
{//类型都是intstd::decay<int&&>::type a;std::decay<int&>::type b;std::decay<const int>::type c;std::decay<volatile int>::type d;//降级为int*std::decay<int[10]>::type e;//void(*)()std::decay<void()>::type f;//enum、class类型std::decay<const Enuma>::type g;std::decay<const Type&>::type h;a = 1;
}

std::remove_reference_t<T> //移除引用
std::remove_cv_t<T>//移除const或volatile
auto初始化是衰变的

std::common_type<typename... T>

函数返回值的类型可以转换的类型。

确定所有类型 T... 的共用类型,即所有 T... 都能隐式转换到的类型。若这种类型(根据后述规则确定)存在,则成员 type 指名该类型。否则,无成员 type 。

#include <type_traits>
#include <iostream>
template<typename T,typename U>
typename std::common_type<T, U>::type max(T t, U u)
{return t > u ? t : u;
}
enum Enuma
{type1,type2
};
class Type{};
void main()
{auto a = max(1, 2.1);//dobuleauto b = max(2, 1.1);//doublestd::cout<< max(1, 2.1)<<std::endl;//2.1std::cout<< max(2, 1.1);//2a = 1;
}
#include <iostream>
#include <type_traits>struct Base {};
struct Derived : Base {};int main(int argc, char** argv)
{{typedef std::common_type<char, short, int>::type A;        typedef std::common_type<float, double>::type B;           typedef std::common_type<Derived, Base>::type C;           typedef std::common_type<Derived*, Base*>::type D;         typedef std::common_type<const int, volatile int>::type E; std::cout << std::boolalpha;std::cout << "typedefs of int:" << std::endl;std::cout << "A: " << std::is_same<int, A>::value << std::endl;std::cout << "B: " << std::is_same<int, B>::value << std::endl;std::cout << "C: " << std::is_same<int, C>::value << std::endl;std::cout << "D: " << std::is_same<int, D>::value << std::endl;std::cout << "E: " << std::is_same<int, E>::value << std::endl;}{typedef std::common_type_t<char, short, int> A;        typedef std::common_type_t<float, double> B;           typedef std::common_type_t<Derived, Base> C;           typedef std::common_type_t<Derived*, Base*> D;         typedef std::common_type_t<const int, volatile int> E; std::cout << std::boolalpha;std::cout << "typedefs of int:" << std::endl;std::cout << "A: " << std::is_same_v<int, A> << std::endl;std::cout << "B: " << std::is_same_v<int, B> << std::endl;std::cout << "C: " << std::is_same_v<int, C> << std::endl;std::cout << "D: " << std::is_same_v<int, D> << std::endl;std::cout << "E: " << std::is_same_v<int, E> << std::endl;}return 0;
}输出:
typedefs of int:
A: true
B: false
C: false
D: false
E: true
typedefs of int:
A: true
B: false
C: false
D: false
E: true

std::is_same<T1,T2>

如果 T 与 U 指名同一类型(考虑 const/volatile 限定),那么成员常量 value 等于 true。

    auto b=std::is_same<int, const int>::value;//false//is_same<>不降级auto b1 = std::is_same<int,std::uint8_t>::value;//false//类型int不相同

constexpr

提供在编译时计算某些值的能力。

template<typename T1,typename T2>constexpr auto max(T1 a,T2 b){return a>b?a:b;}int a[::max(sizeof(int,1000u)];

std::is_default_constructible<T>

T是否有默认的构造函数。


#include <type_traits>
class A {};
class B {B() = delete;
};
int main(int argc, char** argv) {bool b = std::is_default_constructible<A>::value;//truebool b1 = std::is_default_constructible<B>::value;//false
}

std::add_const<T>, std::add_cv<T>, std::add_volatile<T>

增加const, const volatile, volatile.

#include <iostream>
#include <type_traits>struct foo
{void m() { std::cout << "Non-cv\n"; }void m() const { std::cout << "Const\n"; }void m() volatile { std::cout << "Volatile\n"; }void m() const volatile { std::cout << "Const-volatile\n"; }
};int main()
{foo{}.m();//Non-cvstd::add_const<foo>::type{}.m();//Conststd::add_volatile<foo>::type{}.m();//Volatilestd::add_cv<foo>::type{}.m();//Const - volatile
}

std::enable_if<bool B,typename T>

如果B为true,则enable_if拥有T::type,否则无该type。

用于函数返回值、函数参数、模板形参。

template <class _First, class... _Rest>
array(_First, _Rest...) -> 
array<typename _Enforce_same<_First, _Rest...>::type, 1 + sizeof...(_Rest)>;

...补充中


http://www.ppmy.cn/ops/115577.html

相关文章

MySQL 生产环境性能优化

在 MySQL 生产环境中进行性能优化可以从以下几个方面入手&#xff1a; 一、硬件层面 选择高性能服务器&#xff1a; 配备足够的内存&#xff0c;以减少磁盘 I/O。MySQL 可以将经常访问的数据缓存到内存中&#xff0c;提高查询速度。一般来说&#xff0c;对于高负载的生产环境&…

免费ppt模板哪里找?职场必备这些利器

一眨眼&#xff0c;9月份的尾声渐近&#xff0c;无论是学生还是职场人士&#xff0c;都开始准备着新一轮的演讲和报告。在这个忙碌的时期&#xff0c;一份精美的PPT模板能够大幅提升你的工作效率&#xff0c;让你的演示更加引人入胜。 不用担心高昂的版权费用&#xff0c;市场…

PHP API 框架:构建高效API的利器

在当今快速发展的互联网时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为连接不同应用程序和服务的关键。PHP&#xff0c;作为一种流行的服务器端脚本语言&#xff0c;提供了多种强大的框架来简化API的开发。本文将介绍PHP API框架的重要性&#xff0c;以及…

JW01二氧化碳传感器(串行通信 STM32)

目录 一、介绍 二、传感器原理 1.工作原理介绍 2.串口数据流格式 三、程序设计 main.c文件 usart3.h文件 usart3.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 JW01-CO2检测模块是一种用于检测空气中二氧化碳浓度的传感器模块。它可以广泛应用于室内空气质量…

【Android】模糊搜索与数据处理

【Android】模糊搜索与数据处理 本篇博客主要以根据输入内容动态获取城市为例进行讲解。 获取城市 这一部分主要是根据输入的信息去动态获取城市信息 首先定义了一个名为 NetUtil 的类&#xff0c;主要用于通过 HTTP 请求获取城市信息。 public class NetUtil {private stat…

mamba-ssm安装说明(Ubuntu)

1、直接使用pip install mamba-ssm&#xff0c;存在的问题&#xff08;undefined symbol: _ZN3c104cuda9SetDeviceEi in import selective_scan_cuda&#xff09; 猜测原因&#xff1a;没有安装causal_conv1d 2、解决办法——首先下载whl文件&#xff0c;然后pip install **w…

渗透测试入门学习——php文件上传与文件包含

最终效果&#xff1a; 提前在网站根目录创建upload目录&#xff1a; 主页面&#xff08;文件名为file.php&#xff09;&#xff1a; <html> <head><meta charset"utf-8"><title>php文件相关练习</title> </head><h1>php文…

828华为云征文——使用Flexus云服务器X实例CentOS镜像下创建MySQL服务器教程

一、概述 1.1 前言 当前正值华为云盛大的828 B2B企业庆典&#xff0c;其中Flexus X实例的特惠活动尤为吸引人眼球。对于追求极致算力表现&#xff0c;并期望在自建MySQL数据库、Redis缓存系统及Nginx服务器部署上获得卓越性能的企业用户而言&#xff0c;这无疑是一个不可多得的…