【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;
}
原文地址:https://www.cnblogs.com/Trevo/p/14052644.html