zoukankan      html  css  js  c++  java
  • c++11 template 模板练习

    直接上代码吧

    to do 

      1 // 111111.cpp: 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <iostream>
      6 #include <map>
      7 #include <sstream>
      8 #include <algorithm>
      9 #include <vector>
     10 #include <tuple>
     11 #include <type_traits>
     12 
     13 using namespace std;
     14 
     15 void sample1()
     16 {
     17     //基本的type trait
     18     int i = 3;
     19 
     20     if (true == std::is_void<int>::value) {
     21         std::cout << true << std::endl;
     22     }
     23     else {
     24         std::cout << false << std::endl;
     25     }
     26 
     27     if (true == std::is_const<int>::value) {
     28         std::cout << true << std::endl;
     29     }
     30     else {
     31         std::cout << false << std::endl;
     32     }
     33 
     34     if (true == std::is_const<int* const>::value) {
     35         std::cout << true << std::endl;
     36     }
     37     else {
     38         std::cout << false << std::endl;
     39     }
     40 
     41     if (true == std::is_same<int, signed int>::value) {
     42         std::cout << true << std::endl;
     43     }
     44     else {
     45         std::cout << false << std::endl;
     46     }
     47 }
     48 
     49 void sample2()
     50 {
     51     //从 remove_cv remove_reference 到 decay
     52     // const volatile int(remove_cv)--> int == signed int
     53     if (true == std::is_same< std::remove_cv<const volatile int>::type, signed int>::value) {
     54         std::cout << true << std::endl;
     55     }
     56     else {
     57         std::cout << false << std::endl;
     58     }
     59 
     60     // const volatile int&(remove_reference remove_cv )--> int == signed int
     61     // equal std::decay
     62     if (true == std::is_same< std::remove_cv< std::remove_reference< const volatile int&>::type>::type, signed int>::value) {
     63         std::cout << true << std::endl;
     64     }
     65     else {
     66         std::cout << false << std::endl;
     67     }
     68 
     69 
     70     // const volatile int&(remove_reference remove_cv )--> int == signed int
     71     // equal std::decay<>
     72     if (true == std::is_same< std::decay< const volatile int&>::type, signed int>::value) {
     73         std::cout << true << std::endl;
     74     }
     75     else {
     76         std::cout << false << std::endl;
     77     }
     78 }
     79 //===============================================================
     80 // std::decay 还可以用于将函数退化成函数指针 保存 用于延时执行
     81 
     82 template<typename F>
     83 struct SimpleFunction {
     84     using FnType = typename std::decay<F>::type;
     85     SimpleFunction(F f) :m_fn(f) {}
     86     void run() { m_fn(); }
     87     FnType m_fn;
     88 };
     89 
     90 void SimpFunctiontest() {
     91     std::cout << __FUNCTION__ << std::endl;
     92 }
     93 
     94 void sample3()
     95 {
     96     SimpleFunction<void()> f(SimpFunctiontest);
     97     f.run();
     98 }
     99 //===================================================
    100 template<typename T>
    101 typename std::enable_if<std::is_same<T, int>::value, T>::type
    102 foo(T t) {
    103     return t;
    104 }
    105 
    106 void sample4()
    107 {
    108     //enable_if
    109     int i = 1;
    110     foo(i);  //编译通过
    111     char b = 'x';
    112     //foo(b) //编译无法通过 因为 b的type不是int
    113 }
    114 //==============================================================
    115 class Person {
    116 public:
    117     Person(std::string s) :name(s) {}
    118     std::string name;
    119 };
    120 
    121 std::string funtion(Person p) {
    122     return p.name;
    123 }
    124 
    125 
    126 template<typename Fn>
    127 multimap<typename std::result_of<Fn(Person)>::type,Person>
    128 GroupBy(const vector<Person>& vt, Fn&& keySelector)
    129 {
    130     typedef typename std::result_of<Fn(Person)>::type key_type;
    131     multimap<key_type, Person> map;
    132     std::for_each(vt.begin(), vt.end(), [&](const Person& person) 
    133     {
    134         map.insert(make_pair(keySelector(person), person));
    135     });
    136     return map;
    137 }
    138 
    139 void sample5() {
    140     // result_of 获取函数返回值类型
    141     vector<Person> vp;
    142     vp.push_back(Person("1"));
    143     vp.push_back(Person("2"));
    144     vp.push_back(Person("3"));
    145      GroupBy(vp, funtion);
    146 }
    147 //==============================================================
    148 template<typename T>
    149 typename std::enable_if<std::is_arithmetic<T>::value,int>::type foo1(T t)
    150 {
    151     std::cout << t << std::endl;
    152     return 0;
    153 }
    154 
    155 template<typename T>
    156 typename std::enable_if<!std::is_arithmetic<T>::value, int>::type foo1(T t)
    157 {
    158     std::cout << typeid(T).name() << std::endl;
    159     return 1;
    160 }
    161 
    162 void sample6()
    163 {
    164     //enable_if
    165     int i = 1;
    166     std::string b = "123ffdh";
    167     foo1(i);
    168     foo1(b);
    169 }
    170 //==========================================================================================
    171 template<typename T>
    172 typename std::enable_if<std::is_arithmetic<T>::value,std::string>::type
    173 MyToString(T& t) { return std::to_string(t); }
    174 
    175 template<typename T>
    176 typename std::enable_if<std::is_same<T,std::string>::value,std::string>::type
    177 MyToString(T& t) { return t; }
    178 
    179 void sample7()
    180 {
    181     //enable_if示例
    182     int i = 1;
    183     MyToString(i);
    184     double d = 123.213;
    185     MyToString(d);
    186     std::string s = "zxd12";
    187     MyToString(s);
    188 }
    189 //===============================================================
    190 template<std::size_t I =0,typename Tuple>
    191 typename std::enable_if<I == std::tuple_size<Tuple>::value>::type printtp(std::string s,const Tuple& t){
    192     std::cout << std::endl <<s << std::endl;
    193 }
    194 
    195 template<std::size_t I = 0, typename Tuple>
    196 typename std::enable_if<I < std::tuple_size<Tuple>::value>::type printtp(std::string& s,const Tuple& t) {
    197     std::cout << std::get<I>(t) << std::endl;
    198     s += std::to_string(I);
    199     s += " ";
    200     printtp<I + 1>(s,t);
    201 }
    202 
    203 template<typename ... Args>
    204 void MyPinrt(Args... args)
    205 {
    206     std::string s;
    207     printtp(s,std::make_tuple(args...));
    208 }
    209 
    210 void sample8()
    211 {
    212     MyPinrt(1,1.2324,false,"safda");
    213 }
    214 
    215 //===========================================================================
    216 int main()
    217 {
    218     /*sample1();
    219     sample2();
    220     sample3();
    221     sample4();*/
    222     //sample5();
    223     //sample6();
    224     sample7();
    225     sample8();
    226     return 0;
    227 }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    iOS程序-UIScrollView的基本使用
    iOS方法类:CGAffineTransform
    指南针开发
    iOS用if语句判断null
    UIView常用的一些方法
    xcode视图缩短了
    TCP&UDP基础
    朴素贝叶斯方法在乳腺肿块检测中的应用
    进程与线程的相关知识点总结
    C++中sizeof操作符与strlen函数
  • 原文地址:https://www.cnblogs.com/itdef/p/8204707.html
Copyright © 2011-2022 走看看