zoukankan      html  css  js  c++  java
  • 【C/C++】【模板与泛型】typename

    typename的使用场合

    • 模板定义中,表明其后的模板参数是类型参数

      template<typename T, int a, int b> //typename后跟的是一个类型
      int funcadd(T c){...}
      
      
      template<typename T> //typename可以写为class
      class Vector{...}
      
    • 使用类的类型成员,用typename来标识这是一个类型

      // ::作用域运算符 访问类中的静态成员的时候 类名::静态成员名
      int Time::mystatic = 5;
      
      //通知编译器,一个名字代表的是一个类型。这里typename不能换成class
      template<typename T>
      //必须使用typename
      //typename的目的是告诉编译器iter是一个类型
      typename my_vector<T>::iter  my_vector<T>::begin(){...}
      

    函数指针做其他函数的参数

    #include <iostream>
    using namespace std;
    
    
    int sum(int a, int b)
    {
        return a + b;
    }
    
    int sub(int a, int b)
    {
        return a - b;
    }
    
    //函数指针做函数参数
    
    //定义函数指针类型
    typedef int(*FunType)(int, int);
    
    
    void testFunc(int i, int j, FunType func)
    {
        //可以通过函数指针调用函数
        int res = func(i, j);
        cout << res << endl;
    }
    
    int main()
    {
        testFunc(1, 2, sum);
        testFunc(1, 2, sub);
        return 0;
    }
    

    函数模板范例

    
    //testfunc(3, 4, mf);
    template <typename T, typename F>
    void testfunc(const T& i, const T& j, F func)
    {
    	cout << func(i, j) << endl;
    }
    
    
    • 使用模板参数为函数指针的函数模板,可调用对象为实参
    //使用模板参数为函数指针的函数模板
    //可调用对象为参数
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    int mf(int tmp1, int tmp2)
    {
    	return tmp1 + tmp2;
    }
    //函数指针做函数参数
    
    //定义函数指针类型
    typedef int(*FunType)(int, int);
    
    void testFunc(int i, int j, FunType func)
    {
    	//可以通过函数指针调用函数
    	int res = func(i, j);
    	cout << res << endl;
    }
    
    template <typename T, typename F>
    void testfunc(const T& i, const T& j, F func)
    {
    	cout << func(i, j) << endl;
    }
    
    
    //可调用对象所代表的类
    class Tc
    {
    public:
    	Tc()
    	{
    		cout << "构造函数执行" << endl;
    	}
    	Tc(const Tc& t)
    	{
    		cout << "拷贝构造函数执行" << endl;
    	}
    
    	int operator()(int v1, int v2) const
    	{
    		return v1 + v2;
    	}
    };
    
    
    int main()
    {
    	//Tc tc;
    	//构造函数  拷贝构造函数
        //会产生临时对象
    	//testfunc(1, 2, tc);
    
    	//少调用依次拷贝构造函数 
    	//构造函数
    	testfunc(1, 2, Tc());
    
    	return 0;
    }
    

    默认模板参数

    // 类模板 类模板名后必须用<>来提供额外的信息 <>表示这是一个模板
    #include <iostream>
    #include <string>
    using namespace std;
    
    template<typename T = int, int size = 10>
    class Arr
    {
    private:
    	T arr[size];
    public:
    	void func();
    };
    
    
    int main()
    {
    	Arr<> a;
    	Arr<char> b;
    	return 0;
    }
    
    //函数模板: 老标准只能为类模板提供默认模板参数,C++11新标准可以为函数模板提供默认参数
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    //可调用对象所代表的类
    class Tc
    {
    public:
    	Tc()
    	{
    		cout << "构造函数执行" << endl;
    	}
    	Tc(const Tc& t)
    	{
    		cout << "拷贝构造函数执行" << endl;
    	}
    
    	int operator()(int v1, int v2) const
    	{
    		return v1 + v2;
    	}
    };
    
    template <typename T, typename F=Tc>
    void testfunc(const T& i, const T& j, F func=F())
    {
    	cout << func(i, j) << endl;
    }
    int main()
    {
        //同时给模板参数和函数参数提供缺省值
        //注意写法 F func = F()
        //Tc重载()
    	testfunc(1, 3);
    	return 0;
    }
    
  • 相关阅读:
    redis 学习(一)
    spring 学习总结(一)
    Struts2 学习(三)
    Python3 高级特性
    Python3 模块
    Python3 函数式编程
    Python3 函数
    Python3 列表
    Python3 字符编码
    Java Servlet 回顾
  • 原文地址:https://www.cnblogs.com/Trevo/p/14052644.html
Copyright © 2011-2022 走看看