C++ trais技术 模板特化的应用】的更多相关文章

// traits 的应用 /////////////////////////////////////////// // traits template <typename T> class sigmaTraits {}; // 特化 template <> class sigmaTraits<char> { public: typedef int returnType; }; template <> class sigmaTraits<int>…
 我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程中使用该库,我将头文件包含在 stdafx.h 中,结果出现特化模板函数的符号多重定义错误.我要如何组织头文件才能避免多重符号定义错误?我用 /FORCE:MULTIPLE,但我想用一个更好的解决方法. Lee Kyung Jun  实际上,确实用更好的解决方法.稍后我会解释,但首先让我重温一下模板…
模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一些情况下,能够利用关于类型的一些特殊知识,编写比从模板实例化来的函数更有效率的函数. compare函数和 Queue类都是这一问题的好样例:与C风格字符串一起使用进,它们都不能正确工作. compare函数模板: template <typename Type> int compare(cons…
模板与泛型编程 --模板特化[续] 三.特化成员而不特化类 除了特化整个模板之外,还能够仅仅特化push和pop成员.我们将特化push成员以复制字符数组,而且特化pop成员以释放该副本使用的内存: template<> void Queue<const char *>::push(const char *const &val) { char *new_item = new char[sizeof(val) + 1]; strncpy(new_item,val,sizeof…
模板参数的具体化/特殊化 有时,有些类型不适用,则需要对模板进行特殊化处理,这称为“模板特化” 对函数模板,如果有多个模板参数,则特化时必须提供所有参数的特例类型,不能部分特化: 如: char *sum(char *,char *); 在函数名后用<>括号括起具体类型 template<> char* sum<char*>(char* a,char* b){...} 由编译器推导出具体的类型,函数名为普通形式: template<> char *sum(c…
本篇讲解模板特化------------------------------------------------------------------------------------------------------------第12章 特化和重载------------------------------------------------------------------------------------------------------------前面几篇博客讲解了C++模板如何…
近日,在学习的过程中第一次接触到了Typelist的相关内容,比如Loki库有一本Modern C++ design的一本书,大概JD搜了一波没有译本,英文版600多R,瞬间从价值上看到了这本书的价值!!这是题外话.这本书十分经典.其内容对于一个C++新手来说需要时间来理解吸收.在这里记录一下自己的理解.日后发现错误会给予更正.如有有人碰巧看到了.欢迎指正. 参考了http://blog.csdn.net/gatieme/article/details/50953564 整篇内容分了三个部分:1…
http://blog.csdn.net/yesterday_record/article/details/7304025 很久没有看C++,在看STL源码剖析时,看到一个function template partial order(偏序模板函数)概念,一时不明白,于是在网上搜罗一下,看完了才明白了就是以前在学校看的<C++ Primer>中的模板特例化相关的概念.这里将搜到的资料整理一下. 1. 模板的特化C++中经常为了避免重复的编码而需要使用到模板,这是C++泛型编程不可或缺的利器.然…
OOP面向对象编程 GP泛型编程(generic programming) 两者的主要区别就是OOP将数据和对数据的操作放在一起, GP就是将数据和操作独立开来 GP:   数据就是container进行存储,操作就是函数,也就是最数据操作的算法,container和algorithn都可以各自闭门造车,之间通过iteration联通就可以了 比如说sort sort(begin,end,cmp) algorithm通过iteration操作确定范围,并通过iteration来取出contain…
在C++中,模板特化是除了类之外的一种封装变化的方法.模板特化可以通过编译器来对不同的模板参数生成不同的代码. 模板特化通常以模板结构体作为载体.常用技法包括:类型定义.静态成员常量定义和静态成员函数定义. 从不同的角度来看待模板特化,模板特化可以扮演以下角色: 一.函数 模板结构体可以被看做一种函数,其参数必须是明确的类型.整数或者变长参数.变长参数展开甚至可以递归. 二.分支 模板结构体可以实现判断模板参数的类型来完成不同的工作.在编程的时候,如果碰到类似“如果类型是A时进行a操作,如果类型…
模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化.模板的实例化分为隐式实例化和显示实例化. 对函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用).对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显示指明模板实参.各个概念请勿混淆. 1.隐式实例化 1.…
c++ 模板特化与局部特化 模板的由来是要处理泛化,也就是任何类型都可以处理.但是泛化的同时,如果针对某种特殊的类型,又更加效率的处理方法.c++提供针对特殊的类型,可以定义不同的处理方法.针对某种特殊类型去处理的方式就叫做特化. 特化分全部特化和局部特化 全部特化: template<typename T> class test{ T i; }; template<> class test<int>{ int i; }; 通过上面的例子可以看出,可以针对类型int,定…
哈希函数的作用是将一个值映射为一个哈希值,从而根据这个哈希值,在哈希表中对数据进行定位. template <class _Val, class _Key, class _HashFcn, class _ExtractKey, class _EqualKey, class _Alloc = alloc> class hashtable; STL中定义的hashtable容器包含哈希函数模板参数_HashFcn._HashFcn既然是一个类类型,又能提供函数的功能,因此是一种仿函数(functo…
C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然不利于程序的扩充和维护.C++模板就应运而生.C++的模板提供了对逻辑结构相同的数据对象通用行为的定义.这些模板运算对象的类型不是实际的数据类型,而是一种参数化的类型.C++中的模板分为类模板和函数模板. 类模板如下: #include <iostream>using namespace std;…
1.成员模板 理解起来就是类是模板类,他里面的成员函数又是个模板函数 上图例子:用派生类构造父类 2.模板特化 就是在类模板泛化后写特化的类,在template<>里不绑定类型,而在类后面<绑定类型> 3.模板偏特化 1)绑定个数的偏 就是在泛化时有一小部分元素是固定的某种类型值,例如char,这样可以减少空间,不然泛化的优化就要8字节 在偏特化时为绑定的还是要在template<>里写出来,后在类后面<>写绑定了的和未绑定的,一定从左到右绑定不能跳着绑定…
C++中有类模板和函数模板,它们的定义如下所示: 类模板: template<class T1,class T2> class C { //... }; 函数模板: template<class T1,class T2> void func(T1 p1,T2 p2) { //... }; 特化包括全特化和偏特化,全特化也叫简称特化,所以说特化的时候意思就是全特化. 特化就是对所有的模板参数指定一个特定的类型,偏特化就是对部分模板参数指定特定的类型. 类模板的特化: template…
一 ."函数模板"与"模板函数" 下面几行代码就是一个"函数模板" template <class T> T abs(T x) { return x < 0 ? -x : x; } 根据"函数模板"可以生成不同的函数,这些"实例化"的函数被称之为"模板函数". 如:abs(0.1f);  编译器将根据函数模板生成模板函数abs<float> ,并调用abs&…
个人理解这个东西说白了就是当模板类(或函数)的类型参数为某特定值时用对应的特化定义代之. 看个例子吧 #include <iostream> using namespace std; template<typename T> struct is_void { static const bool value = false; }; /* 上面的代码定义了一个简单的模板结构is_void的主版本,无论类型参数T是何值, * 结构体的静态常量成员value的值都是false,这当然是无意…
模板为什么要特化,因为编译器认为,对于特定的类型,如果你对某一功能有更好地实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是模板如果有多个类型,那么就只限定为其中的 一部分,其实特化细分为范围上的偏特化与个数上的偏特化. 模板的泛化:是指用的时候指定类型. 上面的方框内的内容是指模板的泛化,下面的方框内的内容是指模板的特化.特化的优先级比泛化的优先级高. 模板的偏(范围)特化是指个数,范围上的偏特化 个数上的偏特化,从左到右…
前一篇文章<浅谈C++ templates 函数模板.类模板以及非类型模板参数>简单的介绍了什么是函数模板(这个最简单),类模板以及非类型模板参数.本文对类模板再做几点补充. 文章目录1. 缺省的模板实参2. Traits编程技法——以STL迭代器为例1. 缺省的模板实参这里依旧使用上一篇文章中的array类作为例子,其中有一处改变了——就是将unsigned int N = 10后面添加了一个默认的参数10: template<typename T, unsigned int N =…
类模板的全特化与偏特化 类模板 template<typename T1, typename T2> class Test { public: Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;} private: T1 a; T2 b; }; 全特化 template<> class Test<int , char> { public: Test(int i, char j):a(i),…
#include <iostream> // 偏特化的模板不会自己添加构造函数 ctor 和 析构函数 dtor #if 1 // P1 template <typename T1, typename T2> class Stack { public: Stack() { std::cout << "T, T" << std::endl; }; ~Stack() {}; private: }; #endif // 0 //////////…
1. enable_if 原理 关于 enable_if 原理这里就不细说了,网上有很多,可以参考如下教程,这里只讲解用法实例,涵盖常规使用全部方法. 文章1 文章2 文章3 1. 所需头文件 #include <type_traits> 2. 返回参数特化 //the return type (bool) is only valid if T is an integral type template <typename T> typename std::enable_if<…
#include <iostream> #include <cstdlib> #include <string> using namespace std; template<class T, class P> T mul(T a, P b) { return a * b; } template<> string mul<string, int>(string a, int b) { string res; ; i--) { res.a…
class TClass<T, K> { } class SubTClass<T, C, K> : TClass<Char, K> { } class SubTClass1<K> : TClass<Char, K> { } class SubTClass2 : TClass<Char, int> { }…
LuaBind http://www.rasterbar.com/products/luabind.html http://blog.sina.com.cn/s/blog_646817c00100gk99.html 支持函数重载 LuaBridge https://github.com/vinniefalco/LuaBridge 不支持函数重载…
说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多.我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型: 二是特化为引用,指针类型:三是特化为另外一个类模板. 这里用一个简单的例子来说明这三种情况: // general versiontemplate<class T>class Compare{public:    static bool IsEqual(const T& lh, const T& rh…
在面对C++模板的时候,需要十分注意,因为模板的复杂性有很多情况,所以最好学习模板的方法我个人认为就是用到就去学,用不到就尽量别去看各种奇门怪技,因为你就算看了,好不容易搞懂模板的实现内部了,包括元编程啊什么的,但真正用到工作中的我相信很少,不久你也会忘掉,所以,对于模板,我们可以采取用到哪学到哪的观念去学习,这样可以节省时间并且让效率最大化. 今天主要讲在关于模板特化已经函数重载的问题,简单举下例子 1 void say(int value); 2 template <typename T>…
0 缘起 有一点编程经验和积累,想系统的学习下STL,以前都是随意做的笔记,现在想着成主题的输出一下. 书的原型是ISBN:9787302421757 <C++泛型STL原理和应用>,是从图书馆借的国内大学教材,先把这个读完了,如果有可能的话,就在相应的章节再写一个plus版本. 1 内容 1.1 泛型和模板 1.1.1 泛型的概念 泛型(generic type):就是一种通用类型. T max( T x, T y) {} //这里T是类型占位符. 1.1.2 C++模板及其定义 模板:除了…
     模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型的特殊操作.        最近工作中,需要处理CONT<TYPE>这种复合类型和T这种自定义类型的模板特化,因为CONT类型有五种左右需要特殊处理,其余的可以用默认处理函数,TYPE的具体类型有上千种,但是TYPE类型不涉及不同的操作.      方案一:采用两个模板参数 template &l…