C++模板编程
C++模板编程
NGC_2070
纸上得来终觉浅,绝知此事要躬行!
展开
-
(C++模板编程):typelist实现(类型计算的范例)
typelist实现(类型计算的范例)【基本介绍】《Modern C++ Design》 ---《C++设计新思维》-- Loki实现了typelist(列表头+嵌套列表技术来实现,因为2003年C++不支持可变参模板) typelist:用来操作一大堆类型的C++容器,就象C++标准库中的list容器(能够对各种数值提供各种基本操作),但typelist是针对类型进行操作。 typelist简单的说就是一个类型容器,能够对类型提供一系列的操作(把类型当成数据来操作)。 从实现上,typel原创 2020-11-19 20:25:12 · 2011 阅读 · 0 评论 -
(C++模板编程):混合元编程(下)
目录混合元编程类模板实例化进一步观察【元编程 “计算完整性”概念】inline静态成员变量(C++17中引入)混合元编程类模板实例化进一步观察//泛化版本template <int x_v,int y_v>struct InstantiationObServe{ static const int value = (x_v > y_v) ? InstantiationObServe<x_v - 1, y_v>::value : Inst原创 2020-11-19 17:14:07 · 248 阅读 · 0 评论 -
(C++模板编程):混合元编程(上)
目录混合元编程常规的计算点积范例混合元编程计算点积C++编译的两个阶段代码的智能化产生与膨胀混合元编程【概念介绍】(a)程序员写出一段元编程代码 (b)编译器根据这段代码编译(生成)出来一段新代码,实现程序真正功能的是这段生成的新代码。 (c)编译器会对这段新代码进行编译,产生出最终的可执行程序。 混合元编程可以看成是运行期C++代码的生成器。常规的计算点积范例a)数组a有三个元素,a[0],a[1],a[2],值分别是1,2,3 b)数组b有三个元原创 2020-11-19 13:15:51 · 418 阅读 · 0 评论 -
(C++模板编程):术语、元函数
术语、元函数【元编程介绍】元编程:将各种计算从运行期提前至编译器进行以达到提供程序运行时性能提升的目的,是一种增加程序编译时间从而提升程序运行效率的一种编程技术。 会涉及到很多与循环有关的代码,很多操作针对的是类型、常量,此种循环的实现往往会采用递归手段。 典型范例:typelist(类型列表)、tuple(元组)。 Boost库有一个叫做MPL(Meta-Programming Library)库,用于辅助模板元编程。 参考书籍:《C++模板元编程》书籍,对MPL有比较详细的...原创 2020-11-19 01:20:32 · 1510 阅读 · 0 评论 -
(C++模板编程):策略(policy)技术中的算法策略与总结
目录策略(policy)技术中的算法策略常规范例:普通策略类常规范例:策略类模板【总结】萃取(trait)技术与策略(policy)技术的思想策略(policy)技术中的算法策略算法逻辑分离,解耦合常规范例:普通策略类【引例】//funcsum函数模板template <typename T,typename U = SumFixedTraits<T> > auto funcsum(const T* begin, const T*原创 2020-11-18 20:03:14 · 719 阅读 · 0 评论 -
(C++模板编程):将trait类模板用作模板参数
将trait类模板用作模板参数【引例】//SumFixedTraits类模板template <typename T>struct SumFixedTraits;template<>struct SumFixedTraits<char>{ using sumT = int; static sumT initValue() { return 0; }};template<>struct SumFixedTraits<in原创 2020-11-18 18:52:00 · 277 阅读 · 0 评论 -
(C++模板编程):使用SFINAE特性的信息萃取(下)
目录使用SFINAE特性的信息萃取用成员函数重载实现is_class用成员函数重载实现is_base_of用类模板特化实现is_default_constructible使用SFINAE特性的信息萃取用成员函数重载实现is_class【std::is_class】是否是一个类类型(不是联合类型)的类模板【功能实现】template <typename T>class IsClass{private: template <typename原创 2020-11-18 17:12:29 · 343 阅读 · 0 评论 -
(C++模板编程):使用SFINAE特性的信息萃取(上)
目录使用了SFINAE特性的信息萃取用成员函数重载实现is_default_constructible用成员函数重载实现is_convertible使用了SFINAE特性的信息萃取SFINAE:替换失败并不是 一个错误用成员函数重载实现is_default_constructible【std::is_default_constructible】判断一个类的对象是否能够被默认构造class A {};class B{public: B(int tmpval原创 2020-11-18 15:18:06 · 406 阅读 · 0 评论 -
(C++模板编程):萃取技术中的value traits(值萃取)
目录萃取技术中的value traits(值萃取)一个常规范例判断是否是void类型的一个范例判断两个类型是否相同萃取技术中的value traits(值萃取)固定萃取:给进来一个类型,萃取出一个类型 值萃取核心思想:给进来一个类型,萃取出一个值一个常规范例【引例】//fixed traits类模板的泛化版本template<typename T>struct SumFixedTraits; //不需要实现代码,因为不需要用该版本进行实.原创 2020-11-18 12:19:44 · 507 阅读 · 0 评论 -
(C++模板编程):萃取技术及fixed traits -- const及引用修饰符的移除 、退化(decay)技术
萃取技术及fixed traits【const修饰符的移除】//泛化版本template <typename T>struct RemoveConst{ using type = T;};//特化版本template <typename T>struct RemoveConst<const T>{ using type = T;};//根据需要增加其他特化版本....template <typename T>using原创 2020-11-17 20:12:11 · 1098 阅读 · 0 评论 -
(C++模板编程):萃取技术及fixed traits -- 引用类型的移除和增加
萃取技术及fixed traits -- 引用类型的移除和增加引用类型的移除【std::remove_reference类模板】template <class T1,class T2>void print_is_same(){ cout << "T1类型为:" << typeid(T1).name() << endl; cout << "T2类型为:" << typeid(T2).name() <<原创 2020-11-17 17:45:57 · 453 阅读 · 0 评论 -
(C++模板编程):萃取技术及fixed traits -- 通过容器(数组)类型萃取元素类型范例
通过容器(数组)类型萃取元素类型范例【用GetEleType类模板进行常规实现】//泛化版本template <typename T>struct GetEleType;//特化版本template <typename T>struct GetEleType<std::vector<T>>{ using type = T;};template <typename T>struct GetEleType<std原创 2020-11-17 14:34:43 · 461 阅读 · 0 评论 -
(C++模板编程):萃取技术及fixed traits(固定萃取)-- 迭代器范例
萃取技术及fixed traits(固定萃取)-- 迭代器范例【五类迭代器简介】a)输出型迭代器:struct output_iterator_tag b)输入型迭代器:struct input_iterator_tag c)前向迭代器:struct forward_iterator_tag d)双向迭代器:struct bidirectional_iterator_tag e)随机访问迭代器:struct random_access_iterator_tag 例:vector容器-随机原创 2020-11-16 23:06:13 · 281 阅读 · 0 评论 -
(C++模板编程):萃取技术及fixed traits(固定萃取)
萃取技术及fixed traits(固定萃取)【基本概念】trait(萃取)技术用于对模板中的各种模板参数进行管理。 type traits:类型萃取 fixed traits(固定萃取):主要用于给进来一种类型,萃取出(得到)另外一种类型。【目标】(a)了解标准库中许多trait技术的实现方法。 (b)灵活运用并组合这些实现方法,写出功能跟强大,更优雅和实用的代码。【引例】//计算数组中元素的和值的函数模板template <typename T>T func原创 2020-11-16 19:51:58 · 414 阅读 · 0 评论 -
(C++模板编程):std::is_union、std::is_class、std::integral_constant
目录std::is_union、std::is_class、std::integral_constantstd::is_unionstd::is_classstd::integral_constantstd::is_union、std::is_class、std::integral_constantstd::is_unionstd::is_union是类模板。用于判断某个类型是否是一个联合类型。template <typename T>struct is_原创 2020-11-16 17:18:51 · 1124 阅读 · 0 评论 -
(C++模板编程):std::integer_sequence(下)
std::integer_sequence【逆向排列数字生成一个类型Integer_Sequence_Reverse】//向integer_sequence开头插入元素://泛化版本template<typename INTSEQ, unsigned int NewElem> //INTSEQ代表整个的std::integer_sequence< ......>类型struct IntSeq_PushFront; //因为不使用泛化版本,所以泛化版本可以只声明不定义原创 2020-11-16 15:55:16 · 766 阅读 · 0 评论 -
(C++模板编程):std::integer_sequence(上)
std::integer_sequenceC++14中引入的一个类模板【简化后的源码】template <class T, T... Ints>struct integer_sequence { using value_type = T; static constexpr size_t size() noexcept { return sizeof...(Ints); }};功能:产生整型数字序列,0,1,2,3,4,5 T:int,unsigne.原创 2020-11-16 10:53:15 · 2212 阅读 · 0 评论 -
(C++模板编程):std::remove_all_extents
std::remove_all_extentsstd::remove_all_extents是C++11中引入的类模板。【功能】把一个数组中的数组类型部分移除掉,只保留元素类型。 如:int a[12]; 其中a的类型=int[12]; 即去除[12],只保留元素类型 int【示例】float a[12]; //a的类型int[12];int b[5][8]; //b的类型int[5][8];int c[2][8][9]; //c的类型int[2][8][9];co...原创 2020-11-15 23:30:44 · 763 阅读 · 0 评论 -
(C++模板编程):std::function的实现
std::function的实现【基本概念】std::function:可调用对象包装器,是C++11新标准引入的类模板。 需要添加头文件:#include <functional> 函数名(函数指针)、具有operator()成员函数的类对象、lambda表达式等等,都属于可调用对象。【引例】void myfunc(int tmpvalue) //普通函数{ std::cout << "myfunc执行了:tmpvalue = " << tmpv原创 2020-11-15 21:48:38 · 1958 阅读 · 0 评论 -
(C++模板编程):std::conditional
std::conditional【标准库中的实现方式】template <bool b, class T, class U> //泛化版本struct conditional { using type = T; //type类型别名};template <class T, class U>struct conditional<false, T, U> { using type = U;};很显然,bool值只要为false就执行特化原创 2020-11-15 20:14:49 · 1147 阅读 · 0 评论 -
(C++模板编程):std::void_t(下)
借助void_t和declval实现is_copy_assignable【引例】class ACPABL{};class BCPABL{public: BCPABL& operator=(const BCPABL& tmpobj) //拷贝赋值运算符 { //... return *this; }};class CCPABL{public: CCPABL& operator=(const CCPABL& tmpobj) = de原创 2020-11-15 16:54:14 · 731 阅读 · 0 评论 -
(C++模板编程):std::void_t(上)
目录std::void_t源码分析和常规范例判断类中是否存在某个类型别名判断类中是否存在某个成员变量判断类中是否存在某个成员函数std::void_t源码分析和常规范例源码// ALIAS TEMPLATE void_ttemplate <class... _Types>using void_t = void;功能:能够检测到应用SFINAE(替换失败并不是一个错误)特性时出现的非法类型。换句话说,给进来的类型 _Types 必须是一个有效的原创 2020-11-15 11:12:39 · 2431 阅读 · 0 评论 -
(C++模板编程):std::true_type与std::false_type
std::true_type和std::false_type是两个类型(类模板)。源码// ALIAS TEMPLATE bool_constanttemplate <bool _Val>using bool_constant = integral_constant<bool, _Val>;using true_type = bool_constant<true>;using false_type = bool_constant<false原创 2020-11-14 23:45:13 · 7138 阅读 · 0 评论 -
(C++模板编程):std::declval(下)
目录std::declval返回左值引用还是返回右值引用调用引用限定符修饰的成员函数范例推导函数返回值范例std::declval返回左值引用还是返回右值引用class A{public: A(int i) //构造函数 { printf("A::A()函数执行了,this=%p\n", this); } double myfunc() //普通成员函数 { printf("A::myfunc()函数执行了,this=%p\n", this);原创 2020-11-14 21:13:03 · 645 阅读 · 0 评论 -
(C++模板编程):std::declval(上)
目录基本概念和常规范例获取类中成员函数返回值类型std::declval的作用std::declval为什么返回右值引用类型基本概念和常规范例std::declval是c++11新标准中出现的函数模板,没有函数体(只有声明,没有实现),无法被调用, 一般用于与decltype,sizeof等关键字配合来进行类型推导、占用内存空间计算等。标准库源码add_rvalue_reference:是C++标准库中的类模板,它的能力是给进来一个类型,他能够返回该类型的右值原创 2020-11-14 18:42:48 · 5732 阅读 · 0 评论 -
(C++模板编程):类模板中可变参的逐步展开
类模板中可变参的逐步展开myclasst<Args...>继承template<typename... Args>class myclasst{public: myclasst() { cout << "myclasst::myclasst()执行了,可变参个数=" << sizeof...(Args) << endl; }};template<typename... Args>class mycla原创 2020-11-14 16:39:21 · 232 阅读 · 0 评论 -
(C++模板编程):std::enable_if的使用(下)
目录std::enable_if的使用std::enable_ifstd::enable_if源码偏特化完全可以理解成一种(在编译期)条件分支语句。std::enable_if基础认识enable_if应用于函数模板典型应用是作为函数模板的返回类型enable_if_t (C++14)enable_if用于类模板中问题解决思路[ 注 ]std::is_convertible(C++11)应用范例std::enable_if的使用std::enabl原创 2020-11-14 15:42:17 · 7633 阅读 · 0 评论 -
(C++模板编程):std::enable_if的使用(上)
std::enable_if的使用要逐步的领略泛型编程与以往 面向对象编程 的不同之处。一个简单范例对于重载的函数或者函数模板的选择上,编译器内部有一个自己的规则,并不是简单粗暴的对函数就优先选择,对函数模板就靠后选择。template <typename T>void myfunc(const T& t){ cout << "myfunc函数模板执行了" << endl;}void myfunc(int tmpvalue){原创 2020-11-14 13:57:47 · 589 阅读 · 0 评论 -
(C++模板编程):完美转发范例
目录在构造函数模板中使用完美转发范例使用模板方式 + 完美转发在可变参数模板中使用完美转发范例常规的在可变参模板使用完美转发将目标函数中的返回值通过转发函数返回给调用者函数完美转发失败的情形一例在构造函数模板中使用完美转发范例class Human{public: //构造函数 Human(const string& tmpname) :m_sname(tmpname) { cout << "Human(const string &a原创 2020-11-14 12:33:32 · 413 阅读 · 0 评论 -
(C++模板编程):完美转发 std::forward
std::forward参考:https://blog.csdn.net/baidu_41388533/article/details/109682699void funcLast2(int&& v1, int& v2) //v1是右值{ cout << v1 << endl; cout << v2 << endl;} template<typename F, typename T1,typenam.原创 2020-11-14 09:48:20 · 233 阅读 · 0 评论 -
(C++模板编程):完美转发的概念和步骤演绎
完美转发的概念和步骤演绎直接调用:比如在main 函数中直接调用funcLast()。 转发: 在main 函数中通过funcMiddle()间接调用funcLast。 funcMiddle相当于一个跳板函数(中间函数)。如果有参数,那么参数也需要通过funcMiddle中转传递给funcLast()。 完美转发:实参的属性(const,左值,右值)完全不丢失,原原本本的通过funcMiddle转发给funcLast,这种转发就是完美转发。void funcLast(int v1, in原创 2020-11-14 00:00:44 · 383 阅读 · 0 评论 -
(C++模板编程):常用类型推断规则、auto类型常规推断
目录万能引用类型传值方式传值方式的引申——std::ref与std::cref数组做实参提取字符串长度小技巧函数名做实参初始化列表做实参总结auto类型常规推断:用于变量的自动类型推断传值方式(非指针,非引用)指针或者引用类型但不是万能引用万能引用类型万能引用类型template <typename T>void myfunc(T&& tmprv) { cout << "-----------------原创 2020-11-13 18:31:48 · 716 阅读 · 0 评论 -
(C++模板编程):查看类型推断结果、引用和指针类型推断规则
目录查看类型推断结果boost类型查看应用引用类型T& tmprv类型推断Ttmprv类型推断T&tmprv类型推断<补充>const T&tmprv类型推断编程技巧总结指针类型T* tmprv类型推断const T* tmprv类型推断查看类型推断结果如何查看类型推断结果 当前要解决的问题:如何查看类型推断结果——指编译器给我们进行类型推断的结果 通过“查看编译器类型推断结果”的手段来学习并掌握C++类型推.原创 2020-11-13 13:06:15 · 838 阅读 · 0 评论 -
(C++模板编程):万能引用(未定义应用 / 转发引用)
目录万能引用(universal reference / forwarding reference:转发引用)类型区别基本含义universal reference / 万能引用 / 未定义引用基本认识万能引用离不开两种语境万能引用资格的剥夺与辨认万能引用(universal reference / forwarding reference:转发引用)类型区别基本含义template <typename T>void func(const T&a.原创 2020-11-13 00:35:17 · 549 阅读 · 0 评论 -
(C++模板编程):模板代码的组织结构与模板的显式实例化和声明
目录模板代码的组织结构与模板的显式实例化和声明模板代码的组织结构模板的显式实例化,模板声明,代码组织结构模板代码的组织结构与模板的显式实例化和声明模板代码的组织结构普通类:类定义和类实现要分别放在.h头文件和.cpp源文件中。 编译项目时编译器会针对每个.cpp源文件作为一个编译单元来编译示例myclass.h#ifndef __MYCLASS_H__#define __MYCLASS_H__#include <iostream>//类定义/原创 2020-11-12 22:42:23 · 243 阅读 · 0 评论 -
(C++模板编程):模板的一些特殊继承关系说(下)
目录模板的一些特殊继承关系说混入(Mixins)通过混入技术方便的组合,自由的装配各种功能用参数化的方式表达成员函数的虚拟性模板的一些特殊继承关系说混入(Mixins)是一种编程手法,用于描述类与类之间的一种关系。 这种关系类似于多重继承,看起来更象颠倒过来的继承。传统的继承方式编程案例//role角色类,代表玩家,包括攻击力,防御力,血量(生命值):class role{public: //构造函数: role() :m_attack(0.0),.原创 2020-11-12 18:06:02 · 362 阅读 · 0 评论 -
(C++模板编程):模板的一些特殊继承关系说(上)
目录模板的一些特殊继承关系说在基类中使用派生类对象基于减少派生类中代码量的考虑基类调用派生类的接口与多态的体现(静态多态编程技术)模板的一些特殊继承关系说奇异(奇特)的递归模板模式(CRTP):Curiously Recurring Template Pattern。 是一种模板编程手法:把派生类作为基类的模板参数在基类中使用派生类对象template <typename T> //T代表的就是派生类class Base //Base是类模板.原创 2020-11-12 14:51:47 · 352 阅读 · 0 评论 -
(C++模板编程):多态在模板中的应用
多态在模板中的应用从表现形式上 回顾一下 多态的概念 有父类有子类(有继承关系),父类中必须含有虚函数,子类重写父类中的虚函数。 父类指针指向子类对象或者父类引用绑定(指向)子类对象。 当以父类的指针或者引用调用子类中重写了的虚函数时,就能看出多态的表现来了,因为调用的是子类的虚函数。 //多态//人类class Human{public: virtual void eat() { cout << "人类以吃米饭和面食为主!" << endl;原创 2020-11-12 11:36:35 · 512 阅读 · 0 评论 -
(C++模板编程):通过递归组合、tuple及基类参数包展开参数包
通过递归组合方式展开参数包组合关系也称为复合关系,实际上就是 一种包含关系class B{ //.....};class A{public: B b; //A中包含B对象,b作为类A的成员变量};通过递归组合方式示例//主模板定义(泛化版本的类模板)template <typename ...Args>class myclasst{public: myclasst() { printf("myclasst::myclasst()泛化...原创 2020-11-11 23:56:37 · 1398 阅读 · 0 评论 -
(C++模板编程):通过递归继承方式展开类型、非类型、模板模板参数包
目录可变参类模板通过递归继承方式展开类型、非类型、模板模板参数包类型模板参数包的展开,此范例取材于C++标准库中的tuple(元组)非类型模板参数包展开示例模板模板参数包的展开示例可变参类模板允许模板定义中包含0到多个(任意个)模板参数通过递归继承方式展开类型、非类型、模板模板参数包类型模板参数包的展开,此范例取材于C++标准库中的tuple(元组)//主模板定义(泛化版本的类模板)template <typename ...Args>cl原创 2020-11-11 20:18:52 · 1754 阅读 · 0 评论