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

程序运行结果如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值