【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;
}