模板编程
文章平均质量分 68
整理行囊
时刻反省自己能不能吃这碗饭,程序员存在的使命就是优化,当你学不进去的时候就是该走的时候了。
展开
-
判断是否是函数类型(学习到了函数和引用没法被const修饰,重新复习了下顶层const和底层const)
//是否是const类型利用特化是实现template <class>_INLINE_VAR constexpr bool is_const_v = false; // determine whether type argument is const qualifiedtemplate <class _Ty>_INLINE_VAR constexpr bool is_const_v<const _Ty> = true;template <class _原创 2022-02-16 00:19:25 · 197 阅读 · 0 评论 -
type_traits--3
文章目录一、源码二、源码解析1.remove_extent:移除数组的第一层维度2.remove_all_extents: 移除所有数组维度3.remove_pointer: 移除指针类型4.add_pointer : 添加指针类型5.is_array: 判断是否是数组类型6.is_reference:是否是引用类型。is_lvalue_reference: 左值引用,is_rvalue_reference: 右值引用7.is_pointer: 是否是指针类型8.is_null_pointer: 判断指针是原创 2022-02-13 21:27:26 · 390 阅读 · 0 评论 -
type_traits-_Add_reference解析(void_t类型的使用,declval解析)
文章目录前言一、源码二、解析1.源码解析2.测试demo前言根据源码看要是传入左值引用的话即便调用返回右值返回的依旧是左值。(这部分真的理解不了,我找了好久也不知道为啥如此设计。我看源码一直以为自己理解错误了,我一直以为他是可以将引用擦除掉的。我还特意以为void_t可以类型擦除(我以为void_t<T&>里可以匹配到左值然后把他擦除掉。),说来可笑,这几天一直找原因。还以为我之前学习的模板类型推导理解出现了问题导。特意把之前的又都梳理了一下。后来本地demo测了一下。无语了。他就是原创 2022-02-13 01:19:27 · 676 阅读 · 0 评论 -
--------------
void_t作用:就是判断类型能被生成类似:enable_iftemplate <bool _Test, class _Ty = void>struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty>struct enable_if<true, _Ty> { // type is _Ty for _Test using type = _Ty;};template原创 2022-02-12 02:48:23 · 176 阅读 · 0 评论 -
---------
类型擦除条件。测试发现可以通过特化方式将类型擦除,但是仅限单个参数时可以实现,猜测因为多个参数时不知道以谁为主,因此就保存了传入的类型。测试demo如下。#include <iostream>#include <xtr1common>using namespace std;namespace xxx{ template<class T> struct MyStruct { MyStruct() {原创 2022-02-11 00:54:01 · 261 阅读 · 0 评论 -
type_traits-integer_sequence解析(继承方式添加可变参数)
文章目录前言定义以及使用一、integer_sequence源码二、使用步骤1.全部解析2.重点解析1. 递归调用自身的模板思想2. integral_constant存在的必要性。总结前言对之前所学进行检验。从源码中学习如何使用模板。定义以及使用integer_sequence:判断是否是整数类型,不是则编译失败(利用静态断言),是则保存自身类型和传入的的整形类型,以及保存可变参数的长度。index_sequence_for:生成指定大小的integer_sequence类型。例如in原创 2022-02-09 00:17:12 · 502 阅读 · 0 评论 -
带你走进模板编程基础2
文章目录前言一、源码二、源码解析1. remove_const:移除const标志2. remove_volatile:去除volatile(感觉没咋用到过的关键字,只是了解不让编译器优化),和const那个使用方式是一样的,利用特化提取了关键字,重新制定了类型3. remove_cv:去除const和volatile属性4. _Disjunction:(感觉咋描述都不清晰)5. disjunction:对_Disjunction不规格数据的过滤,利用继承方式去提取可变参数。6. _Is_any_of_v原创 2022-02-08 01:15:08 · 1079 阅读 · 0 评论 -
模板编程-可变参数
文章目录前言一、可变参数定义二、可变参数个数求取三、可变参数模板函数提取1.递归处理,每次提取一个。2. 逗号表达式方式去展开(很强的想法)三、可变参数模板类提取1.递归处理,每次提取一个。(特化最后的结果)2. 继承方式提取可变参数总结前言之前一直没有想法去了解可变参数,因为知道大概原理,就懒得了解细节了,今天偶然下发现了一篇写的很具参考意义的文章,就想着搬运一下。搬运地址https://www.cnblogs.com/qicosmos/p/4325949.html一、可变参数定义type转载 2022-02-07 18:02:34 · 259 阅读 · 0 评论 -
模板编程基础 -(模板类型class和typename区别,模板模板参数)
文章目录前言一、可变参数的使用前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结二、class和typename区别三、模板模板参数总结前言学习模板编程总能看到可变参数,但是一直没有想学习和整理下,直到碰到了有篇写的很好的文章,我正好整理+学习过来。可变参数参考地址模板类型参考地址模板模板参数参考地址https://www.cnblogs.com/qicosmos/p/4325949.htmlhttps://blog.csdn.net/qq_45801299/article/原创 2022-02-07 00:10:58 · 1833 阅读 · 0 评论 -
move和forward为什么使用方式不同(聊聊forward为什么不让右值以左值的形式转出)
文章目录前言一、move和forward哪里不同,为什那么不同?1.哪里不同2.为什么不同二、为什么forward需要设计两个函数,我认为一个函数就够1.假如forward只有一个函数。2.为什么设计两个函数总结前言我之前提出过问题move和forward为什么使用方式不同,以及哪里不同。一下就会解释。一、move和forward哪里不同,为什那么不同?1.哪里不同使用方式,发现了吧move不需要制定类型,forward使用的时候需要制定类型才能使用。源码里实现方式不同,move只需要一个强转原创 2022-02-05 14:21:38 · 1386 阅读 · 0 评论 -
带你走进模板编程基础
文章目录前言一、部分源码二、详解1.各种宏定义的作用和使用2.源码解读3.模板代码欣赏(标签分发-解决函数无法重载)总结前言想要了解模板编程,肯定绕不过如下基础判断模板。一、部分源码// xtr1common internal header (core)// Copyright (c) Microsoft Corporation.// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception#pragma once#ifndef _X原创 2022-02-05 01:12:29 · 1158 阅读 · 0 评论 -
模板匹配规则
模板类型推导规则模板层面先进行比较然后才是特化层面在进行比较。如下图所示(输出b的函数图1是a的全特化,图2是c的全特化,开始匹配都是模板层面先进行匹配,图1输出c,a和c比较c最为相似,c没有特化输出c。图2输出b,a和c比较c最为相似,c有特化是b,输出为b)函数不支持偏特化(和函数重载规则有混淆,因此被禁止)可以看一下以下文章学习下,如何利用1. 模板类实现函数重载 2. 标签分发。点击跳跃https://zhuanlan.zhihu.com/p/268600376?utm_sourc原创 2022-02-04 00:41:30 · 466 阅读 · 0 评论 -
入门模板编程-forward和move
文章目录前言一、左值和右值二、左值引用,右值引用,万能引用1.左值引用2.右值引用3.万能引用与引用折叠三、forward和move1.forward2. move四、走进forward和move模板编程1. remove_reference引用类型擦除函数2.模板类型推导3.引申 - 萃取(type_traits)总结前言forward和move绝对是你想理解模板编程的第一步。从forward和move入手可以对模板编程快速了解。也会对c++11模板编程越来越痴迷,真的是鬼才的设计。一、左值和右值原创 2022-02-02 17:43:52 · 1481 阅读 · 1 评论