C++中的代码重用(七)=>模板友元

对于模板的友元一般分为三种:

1.非模板友元

2.约束模板函数

3.非约束模板函数

例子如下所示

//class_friend.h
#ifndef CLASS_FRIEND_H
#define CLASS_FRIEND_H
/*非模板友元*/
#include<iostream>
using namespace std;
template<typename U> void cnt();/***********1.约束模板友元函数先声明********************/
template<typename U>void show_object(U &);

template<typename T>
class AC
{
private:
	T data;
	static int count;
public:
	AC(){}
	AC(const T &d) :data(d){ ++count; }
	~AC(){ --count; }
	/*非模板友元函数*/
	friend void get_count();//所有模板实例化的友元
	friend void show(AC<T>&object);//不是模板函数,只是将模板作为参数,必须显式具体化定义
	/*约束模板友元函数*/
	friend void cnt<T>();/*2.声明为模板友元*/
	friend void show_object</*AC<T>*/>(AC<T> &ac);
	/*非约束模板友元函数*/
	template<typename T1, typename T2>friend void show_(T1 &t1, T2 &t2);
};
template<typename T>
int AC<T>::count = 0;

void get_count()
{
	cout << "int count: " << AC<int>::count << "; ";
	cout << "double count: " << AC<double>::count << endl;
}
/*必须显示具体化相应的类型*/
void show(AC<int> &object)
{
	cout << "AC<int>: " << object.data << endl;
}

void show(AC<double> &object)
{
	cout << "AC<double>: " << object.data << endl;
}

/*3.为约束模板友元定义*/
template<typename U>
void cnt()
{
	cout << "template size: " << sizeof(AC<U>) << "; ";
	cout << "template count<U>(): " << AC<U>::count << endl;
}

template<typename U>
void show_object(U &ac)//注意不可写成void show_object<>(AC<U> &ac),与模板声明处相一致
{
	cout << "data: " << ac.data << endl;
}

/*非约束模板友元函数定义*/
template<typename T1, typename T2>
void show_(T1 &t1, T2 &t2)
{
	cout << "T1.data: " << t1.data << ",T2.data: " << t2.data << endl;
}
#endif //CLASS_FRIEND_H

//main.cpp
#include<iostream>
//#include<cstdlib>
#include"windows.h"
#include"class_friend.h"
using namespace std;
int main()
{
	cout << "************非模板友元测试************\n";
	AC<int>obj1(10);
	get_count();//非模板友元函数
	AC<double>obj2(12.0);
	get_count();
	show(obj1);//非模板友元函数
	show(obj2);
	cout << "************约束模板友元测试**********\n";
	AC<int>obj3(5);
	AC<double>obj4(8.0);
	cout << "show_object(obj3): ";
	show_object(obj3);
	cout << "show_object(obj4): ";
	show_object(obj4);
	cout << "cnt<int>(): ";
	cnt<int>();
	cout << "cnt<double>(): ";
	cnt<double>();//注意调用格式
	cout << "************非约束模板友元测试********\n";
	cout << "show_(obj3, obj4): ";
	show_(obj3, obj4);
	cout << "Done!" << endl;
  system("pause");
  return 0;
}

程序运行结果如下

猜你喜欢

转载自blog.csdn.net/weixin_43871369/article/details/85014536