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++ 模板的全特化与偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是如果这 ...
随机推荐
- apple watch 与 iphone 之间的通信方式
apple watch 与 iphone 之间的通信方式:通过watchkit WatchKit应用扩展都提供一个名为WKInterfaceController的子类来管理相应的界面. 启动watch ...
- 【开发技术】 使用JSP开发WEB应用系统-------笔记
1.主机IP地址是:localhost or 127.0.0.1 or 实际的IP地址 2.Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 3.WebRoo ...
- flannel 网络问题排查
1. 如果你发现 k8s容器无法访问外网? 重启docker 原因是,docker重启后会重新生成网桥.网络不通的原因是flannel启动后生成的网络覆盖了docker的网络,当你重启docker后, ...
- 深入浅出讲解:php的socket通信[转]
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP?2. Sock ...
- Django_项目初始化
如何初始Django运行环境? 1. 安装python 2. 创建Django项目专用的虚拟环境 http://www.cnblogs.com/2bjiujiu/p/7365876.html 3.进入 ...
- Python程序的执行方式
Python代码有两种执行方式: 一.文件执行 二.交互器执行(推荐) 一.文件执行 1.用 notepad++ 或 Sublime Text,甚至 写字本创建一个文件. 2.比如:print('He ...
- 通过编程为Outlook 2007添加邮件规则
Outlook 所支持的邮件规则相当有用,我们经常需要针对某些特征的邮件做特殊的处理.例如将其移动到某个特定文件夹,或者删除它等等. Outlook所支持的邮件规则主要两大类:收到邮件时和发送邮件时 ...
- VisionPro随笔-Visionpro空间字符的含义
在visionpro中名字空间是一个非常重要的概念.简单的说就是在图像中的一个特殊坐标系. 下面说下名字空间中一些固定的字符的特殊含义: 1)“.”=这个表示使用输入图像的当前名字空间.即cogima ...
- 数据库MySQL的基本操作
1.MySQL数据库的安装: CentOS6上mysql服务端和客户端的安装和启动: #使用yum安装mysql数据库的服务端和客户端 yum install -y mysql mysql-serve ...
- Windows远程桌面卡的解决办法
Windows远程桌面卡的解决办法 如果在网络没有什么大问题的情况下,可以尝试以下操作. 1.显示中颜色选择 增强色15位 2.体验中 设置成下图的样子 然后在尝试连接试试有没有好点