模板
文章平均质量分 78
A鱼翔浅底A
每天进步一点点...
QQ:1106533113
展开
-
模板-可变参数模板展开
模板-可变参数模板展开一、可变参数模板C++11增强了模板功能,在C++11之前,类模板和函数模板只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”。省略号的作用有两个:声明一个参数包,这个参数包中可以包含0...原创 2020-03-27 16:26:00 · 2672 阅读 · 0 评论 -
模板:如何判断模板参数T为内建数据类型
#include #include using namespace std;//基本模板,一般情况下T不是基本类型template class IsFundaT { public: enum { Yes=0, No=1 };};//用于特化基本类型的宏#define MK_FUNDA_TYPE(T) \原创 2017-02-07 17:53:00 · 1811 阅读 · 0 评论 -
模板实现的静多态
一、概念引入动多态:根据继承和虚函数实现的多态,这里不过多介绍静多态:通过模板技术实现的多态,在编译期决定特点:具有隐式的公共性,必须支持某些使用公共的语法操作(也就是说,相关的函数必须具有相同的名称),另外具体类之间的定义是相互独立的二、举例// 具象的几何类别 Circle // - 不衍生自任何类别 class Circle { public:原创 2017-01-16 18:29:57 · 334 阅读 · 0 评论 -
模板:如何判断模板参数T为内建数据类型(2)
前面博客提到了如何判断T为内建数据类型,这篇博客将会进一步介绍如何确定内建数据类型的哪种具体类型下面是具体的代码实现:#include #include using namespace std;//判断参数是否为内建类型(基本类型)//基本模板,一般情况下T不是基本类型template class IsFundaT { public:原创 2017-02-08 10:06:20 · 566 阅读 · 0 评论 -
模板:fixed trait类的简单使用
以下是一个用于求和的accum 模板,自动根据参数的类型求某段区间内元素值的总和template class AccumulationTraits; templateclass AccumulationTraits { public: typedef int AccT; static AccT zero() { return 0; } };原创 2017-01-20 16:04:08 · 266 阅读 · 0 评论 -
模板:参数化 trait 的 使用方法
一、需求引入根据前一篇博客,我们已经知道了fixed trait的使用方法,因为一旦定义trait 完毕,你就不可以在算法中覆写(overridden)它。不过某些情况下 这样的覆写可能是我们想要的,例如当我们碰巧知道某一套浮点数可被安全地累计放进一个同 型的(浮点数)变量中,「覆写 traits」就有可能使我们的开发更高效。 原则上,解决方案是这样:添加一个带有默认值的原创 2017-01-20 18:56:36 · 377 阅读 · 0 评论 -
模板:policy类的简单使用
一、需求引入到目前为止,我们一直都将累计(accumulation)与求和(summation)混为一谈。显然我们其实可以设想其它种类的累计。例如我们可以求给定之实值序列的乘积;如果被操作的实值是字串,我们可以将它们串接起来;甚至「寻找序列中的最大值」也可被归结为累计问题。在所有情况中,accum()惟一需要修改的就是 total += *beg。这个操作可被称为「累计运算」过程中的一个原创 2017-01-21 15:00:32 · 700 阅读 · 0 评论 -
模板:用双重模板参数实现 简单的 policy 类
一、需求引入前一篇博客说明了用普通类来实现policy的接口,接下来让我们用模板类来实现policy的接口二、实现第一种实现方式:policy是一个模板类: 类型模板类template class AccumulationTraits; templateclass AccumulationTraits { public:原创 2017-01-21 16:22:04 · 414 阅读 · 0 评论 -
模板的使用:如何判断参数是否为一个类
一、需求引入如果给你一个变量,该如何判断是一个普通变量还是一个类变量呢?二、模板实现template class IsClassT { private: typedef char One; typedef struct { char a[2]; } Two; //如果C是类变量,调用这个template static One test(i原创 2017-01-22 11:33:41 · 1559 阅读 · 1 评论 -
模板的使用:Promotion Traits( 类型提升之特征萃取)
一、需求引入让我们先来看一个函数模板template Array operator+ (Array const&, Array const&); 这很好,但由于语言允许我们将一个 char 和一个 int 相加,我们十分希望诸如此类的混合操作 也能实施于 arrays 身上。这么一来我们就必须决定新版本的回返类型(return type)应该是什么: tem原创 2017-01-22 17:33:44 · 401 阅读 · 0 评论 -
模板的应用: 判断类型选择合适的传参方式 以提高效率
一、需求引入我们都知道,对于一个很大的数据结构而言,采用传值的方式通常是很耗费资源的,因此对于这种数据结构,应该“传const 引用”(或者在C中传递const指针);相反,对于更小的数据结构,情况并非这么简单:通常依赖于实际的代码体系结构,总的来说小的数据结构究竟采取何种传递方式,对性能影响并不大,但是也必须小心处理二、实现方式面对 templates,事情变得更为棘手。原创 2017-01-23 11:34:17 · 462 阅读 · 0 评论 -
递归模板模式的使用: 统计某类对象的个数
一、概念引入什么叫递归模板模式呢?简单的来说就是:派生类将本身作为模板参数传递给基类//传递派生类类型template class CuriousBase {....};template class CuriousTemplate : public CuriousBaseCuriousTemplate >{....};//传递派生原创 2017-01-24 16:29:18 · 361 阅读 · 0 评论 -
基于模板、全局特化、局部特化实现的链表
下面代码仅仅作为例子:#include #include#includeusing namespace std;//主模板template class List { public: void append(T const& elemt){ vt.push_back(elemt);原创 2017-01-16 16:29:31 · 272 阅读 · 0 评论 -
模板元编程的2个小例子
一、概念引入metaprograming含有对一个程序进行编程的意思,含有一种反射的特性:metaprograming组件只是程序的一部分,而且它也只生成一部分代码或者程序。metaprograming有一个重要的特点:某些用户自定义的计算可以再程序的编译器进行,带来程序性能的提升和接口简单性的提升二、template metaprograming(模板元编程)的2个例子/原创 2017-02-06 17:39:30 · 566 阅读 · 0 评论 -
模板类型实参和非类型实参的使用 ----- 基于模板的函数指针的使用
我们都会使用c的函数指针的调用函数,那么基于模板该如何实现呢?下面仅仅是个小的实现方式,仅供参考#include #includeusing namespace std; template class C{ public:void fun(int N){nontype_param(N);} }; void fun(int N){原创 2017-01-09 10:43:25 · 263 阅读 · 0 评论 -
重载 函数模板
就像常规(意即non-template)functions一样,function templates 也可以被重载 // 传回两个 ints 中的较大者 inline int const& max (int const& a, int const& b) { return a } // 传回两任意类型的数值中的较大者 template inlin原创 2017-01-03 14:59:17 · 404 阅读 · 0 评论 -
类模板特化
一、主模板#include #include template class Stack { private: // 元素std::vector elems; public: // push 元素void push(T const&);// pop 元素 void pop(); // 传回最顶端元素 T top()原创 2017-01-03 16:31:03 · 356 阅读 · 0 评论 -
类模板的偏特化
Class templates 可以被偏特化(partial specialized,或称部份特化、局部特化)。这使你得以在特定情形下使用特殊实作码,但仍然留给你(使用者)选择 template parameters 的能力。例如对于下面的 class template: template class MyClass { ... }; 以下数种形式的偏特化原创 2017-01-03 16:49:23 · 632 阅读 · 0 评论 -
预设模板自变量
一、预设模板自变量的示例代码你可以针对 class templates 定义其 template parameters 的默认值 , 这称为 default template arguments (预设模板自变量)。预设自变量值甚至可以引用前一步声明的 template parameters。例如在前面博客中提到的class Stack 作为其默认值: #include原创 2017-01-03 17:28:06 · 425 阅读 · 0 评论 -
Nontype Class Template Parameters(非类型类模板参数)
一、需求引入上一篇博客实作了一个「元素个数可变」的stack class。与之对比,你也可以实作另一种stack,透过一个固定大小(fixed-size)的 array来容纳元素。这样做的好处是不必考虑诸如内存管理之类的问题。然而array大小的决定是一件比较困难的事:array愈小则stack愈容易满溢,array愈大则愈容易造成空间浪费 。 一个可行的解决办法是让使用者指定array大原创 2017-01-03 18:33:34 · 307 阅读 · 0 评论 -
非类型函数模板参数
一、引入你也可以为 function template 定义 nontype parameters。例如下面的 function template 定义了一组 函数,可以将参数 x 累加一个值(VAL)后传回: template T addValue(T const& x) { return x + VAL; } 当我们需要把「函数」或「某种通原创 2017-01-04 10:22:03 · 649 阅读 · 0 评论 -
模板 关键词 typename
一、引入关键词typename 是C++标准化过程中被引入的,目的在于向编译器说明template 内的某个标识符是个类型(而不是其它什么东西)。考虑下面的例子: template class MyClass { typename T::SubType * ptr; ... }; 在这里,第一个typename可以换成class, 第二个 typenam原创 2017-01-04 10:48:27 · 252 阅读 · 0 评论 -
Member Templates(成 员模板 )
一、问题引入在前面博客提到的stacks模板类,通常只有当两个 stacks 类型相同,也就是当两个stacks 拥有相同类型的元素时,你才能对它们相互赋值(assign),也就是将某个 stack 整体赋值给另一个。你不能把某种类型的 stack赋值给另一种类型的 stack,即使这两种类型之间可以隐式转型: Stack intStack1, intStack2; // s原创 2017-01-04 12:00:01 · 335 阅读 · 0 评论 -
Template Template Parameters(双重模板参数)
一、需求引入 一个 template parameter 本身也可以是个 class template , 这一点非常有用 。 我们将再次以 stack class template 说明这种用法。 为了使用其它类型的元素容器 , stack class 使用者必须两次指定元素类型: 一次是元素类型本身,另一次是容器类型: Stackint,std::vectorint>原创 2017-01-04 15:39:04 · 2617 阅读 · 2 评论 -
类模板零值初始化
一、需求引入对于基本类型如 int、double、pointer type(指针类型)来说,并没有一个 default 构造函数将它 们初始化为有意义的值。任何一个未初始化的区域变量(local variable),其值都是未定义的: void foo() { int x; // x 的值未有定义 int* ptr; // ptr 指向某处(而不是哪儿都不指向)原创 2017-01-04 16:06:14 · 692 阅读 · 0 评论 -
类模板最常见的链接错误
一、问题引入大多数 C/C++ 程序员大致上都按照以下方式来组织他们的 non-template 程序代码: Classes 和其它类型被全体放置于头文件(header files)。通常头文件的后缀名称(扩展名) 为.hpp(或 .H, .h, .hh, .hxx 等等)。 全局变量和 non-inline 函数只在头文件中置入声明语句, 定义式则置于原创 2017-01-04 16:48:23 · 1346 阅读 · 0 评论 -
模板参数 自变量推导
一、基本概念Function templates 有两种参数: 1. Template parameters(模板参数),在function template 名称前的一对角(尖)括号中声明: template // T 是个 template parameter 2. Call parameters(调用参数),在 function temp原创 2017-01-03 11:46:43 · 556 阅读 · 0 评论