模板类的约束模板友元函数:template friend functions
本来这篇博客是不打算写的,内容不是很难,对于我自己来讲,更多的是为了突出细节。
- 所谓template friend functions,就是使友元函数本身成为模板。基本步骤:
1,在类定义的前面声明每个模板函数。eg:template <typename T> void counts(); template <typename T> void report<>(T &);
2,在类声明中再次将模板声明为友元。template <typename TT>
class HasFriendT
{
....
friend void counts<TT>();
friend void report<>(Testclass<TT> &)
};声明中<>指出这是模板具体化,注意模板具体化和函数具体化有点不一样。对于report,<>可以为空,因为可以从函数参数推断出模板类型参数。在声明的例子中是:HasfriendT<TT>。然而,也可以使用report<HasFriendT<TT>> 来代替 report<> 。
但是counts没有参数,因此必须使用模板参数语法(<TT>)来指明其具体化。还要注意的是,TT是Testclass类的参数类型。
3,为友元提供模板定义。这里的定义只是就“泛型”TT,每个函数定义一个就行。并不需要像函数显式具体化那样为每个特定的类型通通都定义。 - 好了,接下来看代码:
#include <iostream> using std::cout;
using std::endl; template <typename T> void counts();
template <typename T> void report(T &); template <typename TT>
class HasFriendT
{
private:
TT item;
static int ct;
public:
HasFriendT(const TT & i) : item(i) { ct++; }
~HasFriendT() { ct--; }
friend void counts<TT>();
friend void report<HasFriendT<TT>>(HasFriendT<TT> &);
//note: use report<HasFriendT<TT>> not report<TT>
}; template <typename T>
int HasFriendT<T>::ct = ; template <typename T>
void counts()
{
cout << "template size: " << sizeof(HasFriendT<T>) << "; ";
cout << "template counts(): " << HasFriendT<T>::ct << endl;
} template <typename T>
void report(T & hf)
{
cout << hf.item << endl;
} int main(void)
{
counts<int>();
HasFriendT<int> hfi1();
HasFriendT<int> hfi2();
HasFriendT<double> hfi3(15.5); report(hfi1);
report(hfi2);
report(hfi3); cout << "counts<int>() output: \n";
counts<int>();
cout << "counts<double>() output: \n";
counts<double>(); return ;
}开始的时侯,在声明模板时明明counts 和 report 的<>内都是typename T(即<typename T>),我想不明白为什么在class中friend void counts<TT>() 和 friend void report<HasFriendT<TT>>(HasFriendT<TT> &) <>内的参数就不一样了呢(一个是<HasfriendT<TT>> 一个 是 <TT>)。后来仔细看了下,才发现report函数和counts函数处理的对象不一样。report处理的是item,它是类HasFrriendT的成员数据,所以它的类型是<HasFriendT<TT>>。而counts处理的是一个静态成员,对于静态类成员,可以在类声明之外使用单独的语句进行初始化,这是因为静态类是单独存储的,而不是对象的组成部分。也正如本文开头所指出那样:在countsde<>中, TT是Testclass类的参数类型。
- 不知到你有没有发现上面的声明中,一会用TT,一会用T。开始我也纳闷,神经兮兮的认为它们的不同是不是隐含什么细节。后来将它们全部改成TT再编译,发现没什么问题。原来这只是一个泛型的符号而已。。当然,它们也可能真的存在什么不同,但现在我还没有发现。
模板类的约束模板友元函数:template friend functions的更多相关文章
- c++面向对象 之 基础 类修饰符 构造函数 友元函数
1,类和对象 定义一个类,本质上是定义一个数据类型的蓝图.这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作. 类定义格式 ...
- C++模板的实现(模板函数和模板类,附带模板实现顺序表和链表代码)
文章链接:https://blog.csdn.net/qq_38646470/article/details/80209469
- C++模板类中友元函数的写法
首先,已声明好的类Triangle file://Triangle.h template<class T> class Triangle{ public: Triangle(T width ...
- C++学习之友元类和友元函数
C++学习之友元类和友元函数 模板类声明也可以有友元,模板的友元可以分为以下几类: 1.非模板友元: 2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...
- 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- c++类模板之友元函数
前言:自从开始学模板了后,小编在练习的过程中.常常一编译之后出现几十个错误,而且还是那种看都看不懂那种(此刻只想一句MMP).于是写了便写了类模板友元函数的用法这篇博客.来记录一下自己的学习. 普通友 ...
- C++ 模板函数与模板类
一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:
- C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)
转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多 ...
随机推荐
- 添加网站QQ客服链接
http://wpa.qq.com/msgrd?v=3&uin=3475432549&site=qq&menu=yes 将其中的uin值改为客服QQ即可
- URL转换成二维码
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6685804.html 二维码已经成为我们日常生活中的一个不可获取的产物,火车票上,景区门票,超市付款等等都 ...
- python_原始_web框架
创:10_4_2017 修: 什么是web框架? -- 本质上是socket,用户请求来,业务逻辑处理,返回处理结果 -- 包含socket或者不包含socket的框架 什么是wsgi? -- web ...
- MySQL关于Duplicate entry '1' for key 'PRIMARY'错误
今天复习MySQL遇到Duplicate entry '1' for key 'PRIMARY'错误. 原因是主键值为'1'的数据已经存在,主键是唯一的,不可重复.
- 关于php 高并发解决的一点思路
涉及抢购.秒杀.抽奖.抢票等活动时,为了避免超卖,那么库存数量是有限的,但是如果同时下单人数超过了库存数量,就会导致商品超卖问题.那么我们怎么来解决这个问题呢,我的思路如下(伪代码): sql1:查询 ...
- sql server 数值的四舍五入
sql中的四舍五入通常会有round 和cast( …… as decimal())两种方式: 个人建议使用cast 方式: 方式1: 经过试验,同样都可以做到四舍五入,但round如下实例1会报 ...
- webpack 打包成功,但是css不起作用
问题: webpack 打包成功,但是css不起作用 问题分析/解决: 原因有以下几种 使用了webpack2的语法规则不正确; webpack2要求必须写-loader; 可能是只写了css-loa ...
- 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...
- ABAP 7.4 新语法-内嵌生命和内表操作
1.内嵌声明 2.内表操作 3.opensql ************************************************************************ 1. ...
- RabbitMQ基础
上一博客把RabbitMQ的安装配置介绍了下,今天主要是介绍下RabbitMQ的一些基础名词. 一.什么是RabbitMQ?用它能做什么? 1.简介 AMQP,即Advanced Message Qu ...