偏特化

C++模版:偏特化和函数模版的小技巧

戏子无情 提交于 2020-05-04 02:17:35
偏特化就是部分特化。 利用模版的偏特化,可以实现一些类型过滤。 比如,我想让一个类模版指定类型如int能编译过,其他编译不过,代码实现如下: template <typename T> class A; template<> class A<int> { }; int main() { A<int> a; A<double> b; //error return 0; } 以上代码,通用的模版没有实现,只实现了int的特化模版,这样class A就只接受int类型的模版形参了。 同理,我们也能实现让指定类型如int不能编译过,其他都能编译过,代码如下: template <typename T> class A {}; template<> class A<int>; int main() { A<int> a; //error A<double> b; return 0; } 函数模版比类模版多了一个参数传入的过程,所以可以省略模版参数,因为可以从传入的参数推导。比如: #include<iostream> using namespace std; template< typename T> int func(T a, T b) { cout << a + b << endl; return a + b; } int main() { func<int>(3, 4); func(3

篮子、水果和鸡蛋——关于C++的模板偏特化和萃取编程技法

江枫思渺然 提交于 2019-11-29 01:48:52
最近在读《STL源码剖析》。读这本书的时候发现自己的C++的知识其实是非常匮乏的。 从大学的C++教材上学到一些C++基本的语法、内存管理、继承、多态等方面的基础知识。这些只是是一棵大树的根。而读STL的源码和侯捷的解析的时候,发现C++还有很多丰富的细节和技巧。这些是大树上的枝叶。学习C++,不仅要学习根,也要学习枝叶,这样才能让大树茂盛起来。虽然C++语法一些用法较为晦涩,但读完这些代码之后觉得思路比以前更开阔,另外可以活动脑筋。 比如模板的偏特化这个特性。侯捷的《STL源码剖析》中对于模板的偏特化(partial specialization)的解释为: 如果class template拥有一个以上的template参数,我们可以针对其中某个或多个 template参数进行特化工作。template是一个很抽象的东西。template偏特化之后就让模板变得具体那么一点点。 用一个形象一点的比喻吧。我们把template比作一个装东西的篮子。这个篮子既可以装鸡蛋,也可以装苹果。那么所谓偏特化就是让你用一个篮子专门装水果,这就是template水果篮。以后你就只能使用水果篮来装苹果、装梨,而不能使用其他的篮子来装这些水果了。 看一个STL例子: 有一个“篮子” iterator_traits, 它内部typedef 了value_type类型,用来定义模板的参数类型class I