C++ 函数模板“偏特化”
template <typename TYPE, template<typename> typename CONT>
void func(const CONT<TYPE> &v) {}
//或
template <typename T>
void func(const T &v) {}
template<typename TYPE, template<typename> typename CONT>
struct my_class {
my_class() = delete;
static void func(const CONT<TYPE> &v) {}
};
//将CONT偏特化为vector
template <typename TYPE>
struct my_class<TYPE, vector> {
my_class() = delete;
static void func(const vector<TYPE> &v) {}
};
//“偏特化”vector容器类型的模板函数
template <typename TYPE, template<typename> typename CONT>
void func(const CONT<TYPE> &v, std::enable_if_t<std::is_fundamental<TYPE>::value && std::is_same_v<vector<int>, CONT<int>>> * = nullptr)
{} //如果使用C++11版本的gcc时,偏特化vector等标准容器类型的模板函数需要使用如下形式
template <typename T, template<class, class...> class C, class... Args>
void var_func(const C<T, Args...>& v)
{
std::cout << "var_func type" << std::endl;
}
//“偏特化”用户自定义非容器类型的函数
template <typename TYPE, template<typename> typename CONT>
void func(const TYPE &v, std::enable_if_t<!std::is_fundamental<TYPE>::value> * = nullptr)
{} //默认的复合类型模板函数
template <typename TYPE, template<typename> typename CONT>
void func(const CONT<TYPE> &v, std::enable_if_t<std::is_fundamental<TYPE>::value
&& !std::is_same_v<vector<int>, CONT<int>>
&& !std::is_same_v<deque<int>, CONT<int>>
&& !std::is_same_v<list<int>, CONT<int>>> * = nullptr)
{} //对于函数体内的auto类型的变量(由CONT和TYPE组合成的复合类型),可以通过以下手段判断其类型
using T = std::decay_t<decltype(variable)>;
if constexpr (std::is_same_v<vector<type>, T>)
func<type, vector>(variable);
else if constexpr (std::is_same_v<my_type, T>)
func<my_type, deque>(variable);
....
- 函数模板的定义和声明必须都放到头文件中,因为编译器在编译阶段需要依据头文件中模板函数的定义来实现模板的实例化
- 不建议将函数模板编译成静(动)态库,然后源文件只包含模板函数声明的头文件,这样在链接的时候提示undefined 的类似错误,因为函数库只能导出实例化的函数,对于没有实例化模板函数,就会出现undefined的错误(除非在函数库中,将所有可能的实例化类型都实例化一遍)。建议,对模板的使用通过头文件的方式。
- 类模板如果有默认模板参数,那么只能在声明或者定义其中任何一个位置设置默认模板参数,不能两个位置都设置。
C++ 函数模板“偏特化”的更多相关文章
- 函数模板“偏特化” (C++)
模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型 ...
- [转]Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧
STL中,traits编程技法得到了很大的应用,了解这个,才能一窥STL奥妙所在. 先将自己所理解的记录如下: Traits技术可以用来获得一个 类型 的相关信息的. 首先假如有以下一个泛型的迭代器类 ...
- 【转】traits技术及模板偏特化
#include <iostream> using namespace std; struct __xtrue_type { }; // define two mark-type stru ...
- 【校招面试 之 C/C++】第2题 函数模板、类模板、特化、偏特化
1.C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样 ...
- C++的模板特化 和 STL中iterator_traits模板的偏特化
C++中有类模板和函数模板,它们的定义如下所示: 类模板: template<class T1,class T2> class C { //... }; 函数模板: template< ...
- c++模板特化偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你对某一功能有更好地实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是模板如 ...
- C++中模板的特化与偏特化
1.引言 C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现.目前,STL在C++社区中得到了广泛的关注.应用和研究.理 ...
- [转]C++中模板的特化与偏特化
转载自:http://hi.baidu.com/klcdyx2008/blog/item/5adbf77b79f316f90bd1873c.html 1.引言C++中的模板分为类模板和函数模板,虽然它 ...
- C++ 模板的全特化与偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是如果这 ...
随机推荐
- APIs
应用程序接口(application programe interfaces)
- mysql查看表大小
mysql查看表大小 一:命令 show table status like 'table_name'\G; mysql> show table status like 'x'\G; . row ...
- MYSQL问题解决方案:Access denied for user 'root'@'localhost' (using password:YES)
这两天在MyEclipse中开发Web项目时,连接MYSQL数据库,出现问题:Access denied for user 'root'@'localhost' (using password:YES ...
- ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest. ...
- U8g2库I2C总线再次突破性调试成功
这次采用U8X8的方式,不再采用u8g2,因为后者一直报内存问题.所以采用了不占内存的u8x8模式 同时u8g2库文件的示例代码也是很牛逼的, 里面还有message box 非常的可爱运行效果也非常 ...
- JavaWeb项目架构之Redis分布式日志队列
架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了. 前言 为什么需要消息队列? 当系统中出现"生产"和" ...
- 日历插件——laydate.js
laydate是一款很好用的日历控件,兼容了包括IE6在内的所有主流浏览器,默认有三种皮肤,如需其它皮肤可去官网下载http://www.layui.com/laydate/ 一.核心方法:layd ...
- MOOC网视频下载并视频倍速播放,超简单哒,亲测可用,( •̀ ω •́ )y
由于视频在线播放太卡,想着下载看吧~~可是这个坑爹的网站没有下载按钮,难道就不可以下载视频了吗? 小白不甘心~ 于是动手查了一下,实验很成功,估计如果会爬虫的都不用像我一样一个一个自己去下了,奈何我知 ...
- 【转】C++易混知识点3. New Operator, Operator New, Placement New 实例分析,比较区别
我们知道,C++中引入了New 这个内置符号,很大方便了指针的使用,程序员不必关注与这块堆上新分配的内存是如何来的,如何初始化的,然后如何转换为我们想要的类型指针的.现在,我们重点来分析下这个NEW内 ...
- 【转】sed 的参数
一.15个参数 1.r 从文件读入 [root@watchout2 ~]# cat file12345 [root@watchout2 ~]# cat newfile abcde [root@watc ...