c++11 template 模板练习
直接上代码吧
to do
// 111111.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <map>
#include <sstream>
#include <algorithm>
#include <vector>
#include <tuple>
#include <type_traits> using namespace std; void sample1()
{
//基本的type trait
int i = ; if (true == std::is_void<int>::value) {
std::cout << true << std::endl;
}
else {
std::cout << false << std::endl;
} if (true == std::is_const<int>::value) {
std::cout << true << std::endl;
}
else {
std::cout << false << std::endl;
} if (true == std::is_const<int* const>::value) {
std::cout << true << std::endl;
}
else {
std::cout << false << std::endl;
} if (true == std::is_same<int, signed int>::value) {
std::cout << true << std::endl;
}
else {
std::cout << false << std::endl;
}
} void sample2()
{
//从 remove_cv remove_reference 到 decay
// const volatile int(remove_cv)--> int == signed int
if (true == std::is_same< std::remove_cv<const volatile int>::type, signed int>::value) {
std::cout << true << std::endl;
}
else {
std::cout << false << std::endl;
} // const volatile int&(remove_reference remove_cv )--> int == signed int
// equal std::decay
if (true == std::is_same< std::remove_cv< std::remove_reference< const volatile int&>::type>::type, signed int>::value) {
std::cout << true << std::endl;
}
else {
std::cout << false << std::endl;
} // const volatile int&(remove_reference remove_cv )--> int == signed int
// equal std::decay<>
if (true == std::is_same< std::decay< const volatile int&>::type, signed int>::value) {
std::cout << true << std::endl;
}
else {
std::cout << false << std::endl;
}
}
//===============================================================
// std::decay 还可以用于将函数退化成函数指针 保存 用于延时执行 template<typename F>
struct SimpleFunction {
using FnType = typename std::decay<F>::type;
SimpleFunction(F f) :m_fn(f) {}
void run() { m_fn(); }
FnType m_fn;
}; void SimpFunctiontest() {
std::cout << __FUNCTION__ << std::endl;
} void sample3()
{
SimpleFunction<void()> f(SimpFunctiontest);
f.run();
}
//===================================================
template<typename T>
typename std::enable_if<std::is_same<T, int>::value, T>::type
foo(T t) {
return t;
} void sample4()
{
//enable_if
int i = ;
foo(i); //编译通过
char b = 'x';
//foo(b) //编译无法通过 因为 b的type不是int
}
//==============================================================
class Person {
public:
Person(std::string s) :name(s) {}
std::string name;
}; std::string funtion(Person p) {
return p.name;
} template<typename Fn>
multimap<typename std::result_of<Fn(Person)>::type,Person>
GroupBy(const vector<Person>& vt, Fn&& keySelector)
{
typedef typename std::result_of<Fn(Person)>::type key_type;
multimap<key_type, Person> map;
std::for_each(vt.begin(), vt.end(), [&](const Person& person)
{
map.insert(make_pair(keySelector(person), person));
});
return map;
} void sample5() {
// result_of 获取函数返回值类型
vector<Person> vp;
vp.push_back(Person(""));
vp.push_back(Person(""));
vp.push_back(Person(""));
GroupBy(vp, funtion);
}
//==============================================================
template<typename T>
typename std::enable_if<std::is_arithmetic<T>::value,int>::type foo1(T t)
{
std::cout << t << std::endl;
return ;
} template<typename T>
typename std::enable_if<!std::is_arithmetic<T>::value, int>::type foo1(T t)
{
std::cout << typeid(T).name() << std::endl;
return ;
} void sample6()
{
//enable_if
int i = ;
std::string b = "123ffdh";
foo1(i);
foo1(b);
}
//==========================================================================================
template<typename T>
typename std::enable_if<std::is_arithmetic<T>::value,std::string>::type
MyToString(T& t) { return std::to_string(t); } template<typename T>
typename std::enable_if<std::is_same<T,std::string>::value,std::string>::type
MyToString(T& t) { return t; } void sample7()
{
//enable_if示例
int i = ;
MyToString(i);
double d = 123.213;
MyToString(d);
std::string s = "zxd12";
MyToString(s);
}
//===============================================================
template<std::size_t I =,typename Tuple>
typename std::enable_if<I == std::tuple_size<Tuple>::value>::type printtp(std::string s,const Tuple& t){
std::cout << std::endl <<s << std::endl;
} template<std::size_t I = , typename Tuple>
typename std::enable_if<I < std::tuple_size<Tuple>::value>::type printtp(std::string& s,const Tuple& t) {
std::cout << std::get<I>(t) << std::endl;
s += std::to_string(I);
s += " ";
printtp<I + >(s,t);
} template<typename ... Args>
void MyPinrt(Args... args)
{
std::string s;
printtp(s,std::make_tuple(args...));
} void sample8()
{
MyPinrt(,1.2324,false,"safda");
} //===========================================================================
int main()
{
/*sample1();
sample2();
sample3();
sample4();*/
//sample5();
//sample6();
sample7();
sample8();
return ;
}
c++11 template 模板练习的更多相关文章
- 编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异
编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异 题目挺绕口的.C++ 11的好东西不算太多,但变参模板(Variadic Template)肯定是其中耀眼的一 ...
- 微信小程序新闻列表功能(读取文件、template模板使用)
微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...
- c++11 函数模板的默认模板参数
c++11 函数模板的默认模板参数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...
- django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统
Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...
- 【C/C++开发】C++11的模板类型判断——std::is_same和std::decay
C++11的模板类型判断--std::is_same和std::decay 问题提出:有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是 ...
- angularjs指令系统系列课程(2):优先级priority,模板template,模板页templateUrl
今天我们先对 priority,template,templateUrl进行学习 1.priority 可取值:int 作用:优先级 一般priority默认为0,数值越大,优先级越高.当一个dom元 ...
- ArcGIS API for Silverlight代码中使用Template模板
原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...
- Git commit template 模板设定
多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...
- 一个简单地template模板
之前的项目中用到了artTemplate模板,感觉挺有意思,于是查看相关资料,自己动手写了个简单地template模板插件.虽然会有一些不足,但也是自己的一番心血.主体代码如下 /* * 一个简单地t ...
随机推荐
- 测试工具之appcrawler的使用
appcrawler 标签(空格分隔): appcrawler appcrawler 简介 一个基于自动遍历的app爬虫工具. 支持android和iOS, 支持真机和模拟器. 最大的特点是灵活性. ...
- linux删除历史操作命令
有时候在系统中做了任何操作,但不想被别人知道,毕竟系统别人都可以登入查看,那怎么把自己操作系统的历史命令删除而不让别人知晓呢? 在linux系统里一旦操作了任何命令,都会被记录下来,可以通过histo ...
- linux重新安装python
第一步:下载python2.7 wget https://www.Python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz 第二步: 解压刚刚下载的压缩包 ...
- linux 查看端口占用
参考 https://www.cnblogs.com/wangtao1993/p/6144183.html lsof -i:8000
- javaService
JavaService.exe -install TestService "%JAVA_HOME%\jre\bin\server\jvm.dll" -Djava.class.pat ...
- IDEA中配置Maven+spring MVC+tomcat
一:配置Maven安装教程如下: http://blog.csdn.net/qq_32588349/article/details/51461182 实际安装过程中,如果按照教程配置如下属性,最后创建 ...
- 八 xml模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的 ...
- Kubernetes 之上的架构应用
规划并运转一个兼顾可扩展性.可移植性和健壮性的运用是一件很有应战的事情,尤其是当体系杂乱度在不断增长时.运用或体系 本身的架构极大的影响着其运转办法.对环境的依靠性,以及与相关组件的耦合强弱.当运用在 ...
- 【疑】checkpoint防火墙双链路切换导致丢包问题
拓扑: 外线联通.电信各200M,通过边界交换机(纯二层,用于分线),分别接到主.备防火墙. 具体配置如下: 故障现象: 由于电信光缆中断导致电信链路不可用.大量员工反映频繁出现断网现象,通过公网注册 ...
- win7安装sqlserver2008
双击启动程序,点击安装