直接上代码吧

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 模板练习的更多相关文章

  1. 编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异

    编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异 题目挺绕口的.C++ 11的好东西不算太多,但变参模板(Variadic Template)肯定是其中耀眼的一 ...

  2. 微信小程序新闻列表功能(读取文件、template模板使用)

    微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...

  3. c++11 函数模板的默认模板参数

    c++11 函数模板的默认模板参数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...

  4. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

    Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

  5. 【C/C++开发】C++11的模板类型判断——std::is_same和std::decay

    C++11的模板类型判断--std::is_same和std::decay 问题提出:有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是 ...

  6. angularjs指令系统系列课程(2):优先级priority,模板template,模板页templateUrl

    今天我们先对 priority,template,templateUrl进行学习 1.priority 可取值:int 作用:优先级 一般priority默认为0,数值越大,优先级越高.当一个dom元 ...

  7. ArcGIS API for Silverlight代码中使用Template模板

    原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...

  8. Git commit template 模板设定

    多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...

  9. 一个简单地template模板

    之前的项目中用到了artTemplate模板,感觉挺有意思,于是查看相关资料,自己动手写了个简单地template模板插件.虽然会有一些不足,但也是自己的一番心血.主体代码如下 /* * 一个简单地t ...

随机推荐

  1. 1.1、CDH 搭建Hadoop在安装之前(配置网络名称)

    重要: CDH需要IPv4.不支持IPv6.提示:粘合时,请使用bond0 IP地址,因为它代表所有聚合链接. 按如下方式配置群集中的每个主机,以确保所有成员可以相互通信: 将主机名设置为唯一名称(不 ...

  2. Linux系统服务之inetd

    [Linux系统服务之inetd] inetd的角色是作为Telnet和FTP等与网络服务器相关的进程的“超级服务器”.这是一个简单的道理:并不是全部的服务器进程(包括那些接受新的Telnet和FTP ...

  3. 解题(PockerCompare-扑克牌比较大小)

    题目描述 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):3 4 ...

  4. 安卓自动生成代码插件-Android code Generator(转)

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 介绍 A ...

  5. 将MYSQL的GBK数据库转成_UTF-8数据库的简便方法

    http://wenku.baidu.com/link?url=epKvsEtUbtzdjQEezGdFMDvJiro3X1yKNgb-1cXzi7CEoYhtoJhImkuyTvVgSmfL6AQL ...

  6. centos 7.3+nginx+jira(.bin)+mysql

    JIRA 安装参考资料 http://www.cnblogs.com/ilanni/p/6200875.html 注意服务启动与关闭 service jira stop service jira st ...

  7. PAT1020 (已知中序,后序遍历转前序遍历)

    已知后序与中序输出前序(先序):后序:3, 4, 2, 6, 5, 1(左右根)中序:3, 2, 4, 1, 6, 5(左根右) 已知一棵二叉树,输出前,中,后时我们采用递归的方式.同样也应该利用递归 ...

  8. ios系统微信浏览器、safari浏览器中h5页面上拉下滑导致悬浮层脱离窗口的解决方法

    一. 运行环境: iphone所有机型的qq浏览器,safari浏览器,微信内置浏览器(qq浏览器内核)等. 二. 异常现象: 1. 大幅度上下滑动h5页面,然后停止滑动,有时候会影响到页面滚动,如局 ...

  9. django序列化单表的4种方法的介绍

    这里主要是讲序列化单表的几种方法 先看下models中设计的表结构 from django.db import models # Create your models here. class Book ...

  10. rbac集成 权限分配。之用户管理

    流程都是一样的.就不在详细的记录.只写一点需要注意的地方! 或者 可以改进的地方! 1. 用户表中 只有. name  password email 三个字段. 但是添加用户的页面,应该还要有确认密码 ...