zoukankan      html  css  js  c++  java
  • 泛型编程 基础

    #include "stdafx.h"
    #include <windows.h>
    #include <iostream>
    #include <string>
    #include <vector>

    namespace ns_template
    {
    //
    //函数模版
    //
    template <typename T> //模版形参表,模版形参表可以是
    //1)可以表示类型的类型形参,类型形参跟在关键字class, 或者typename之后定义,这里class和typename使用上没区别 (未知类型)
    //2)可以表示 常量表达式 的非类型形参.非类型形参跟在类型说明符之后声明. (未知值)

    inline
    int CMP(const T& v1, const T& v2)
    {
    if(v1 > v2)
    {
    return -1;
    }
    if(v2 > v1)
    {
    return 1;
    }
    return 0;
    }

    template <typename T, typename T1>
    T& output(T& out, T1 value)
    {
    out << value;
    return out;
    }

    template <class it, class vl>
    it find(it first, it last, vl lvalue)
    {
    it tmp = first;
    while (tmp != last)
    {
    if(*tmp == lvalue)
    {
    break;
    }
    tmp++;
    }

    return tmp;
    }
    //
    //class 和 typename的区别
    //
    /*
    在函数模版形参中,class和typename具有相同的含义.可以互换,那什么情况下需要使用typename,看下面例子
    */
    template <class Param, class U>
    Param func(Param* Array, U value)
    {
    //Param::size_type *p = NULL; //size_type是一个类型成员的名字还是一个类成员的名字,编译器默认
    //假定这样的名字是属于数据成员,而不是类型。如果要编译把 size_type 当作类型,需要显示告诉编译器,就是在前面加上
    //typename就可以。
    typename Param::size_type *p = NULL;
    }

    //
    //非类型 模版形参。在调用函数时,非类型 模版形参 可以用值来替代。
    //
    template <class T, size_t N>
    T* newObject()
    {
    return new T[N];
    }


    }

    void test_template()
    {
    //
    //函数模版实例化.
    //
    std::cout << "CMP INT :" << ns_template::CMP(1, 2) << std::endl;
    std::cout << "CMP STRING : " << ns_template::CMP(std::string("hello"), std::string("sysnap")) << std::endl;

    ns_template::output(std::cout, 1) << std::endl;
    ns_template::output(std::cout, "hello sysnap") << std::endl;

    int iarray[10] = { 1, 2, 3, 4, 5, 6, 7,8,9, 10};
    std::vector<int> v(iarray, iarray + sizeof(iarray)/sizeof(int));
    std::vector<int>::iterator it = ns_template::find(v.begin(), v.end(), 5);
    if(it != v.end())
    {
    std::cout << *it << std::endl;
    }

    int* x = ns_template::newObject<int, 5>();

    }

  • 相关阅读:
    msp430时钟小结
    JDBC第一天连接池案例
    maltab几个常见的问题
    qt 获取天气的接口
    Qt Style Sheets制作UI特效
    qt 在指定区域添加图片
    qt 设置背景图片
    linux下mysql数据库的学习
    qt文本编辑器
    C++小游戏:扑克牌21点
  • 原文地址:https://www.cnblogs.com/sysnap/p/3463627.html
Copyright © 2011-2022 走看看