C++成员模板

12.9 C++成员模板

12.9.1 定义

模板可以是结构体、类或模板的成员(例子是beta类)

12.9.2 代码

beta.h

#pragma once
#ifndef BETA_H_
#define BETA_H_
template <typename T>
class beta
{
private:
    //这个模板类内部模板类在类内部是这样实现的,也可以在外部实现
    //template <typename V> // nested template class member
    //class hold
    //{
    //private:
    //  V val;
    //public:
    //  hold(V v = 0) : val(v) {}
    //  void show() const { std::cout << val << std::endl; }
    //  V Value() const { return val; }
    //};
    //下面这两句是内部类模板的声明
    template <typename V> // declaration
    class hold;
    hold<T> q; // template object
    hold<int> n; // template object
public:
    beta(T t, int i) : q(t), n(i) {}
    //函数模板在模板类内部是这样实现的,也可以在外部实现
    //template<typename U> // template method
    //U blab(U u, T t) { return (n.Value() + q.Value()) * u / t; }
    //下面这两句是模板函数的声明
    template<typename U> // declaration
    U blab(U u, T t);
    void Show() const { q.show(); n.show(); }
};
​
//模板类中模板类在外部的实现
// member definition
template <typename T>
template<typename V>
class beta<T>::hold
{
private:
    V val;
public:
    hold(V v = 0) : val(v) {}
    void show() const { std::cout << val << std::endl; }
    V Value() const { return val; }
};
//模板类中模板函数的外部实现
// member definition
template <typename T>
template <typename U>
U beta<T>::blab(U u, T t)
{
    return (n.Value() + q.Value()) * u / t;
}
#endif

main.h

#pragma once
#ifndef MAIN_H_
#define MAIN_H_
#include <iostream> //输入输出 
#include "beta.h" //template_member
​
void template_member(void)
{
    cout << "template_member Hello**********************************************************" << std::endl;
    beta<double> guy(3.5, 3);//T是double类型,T是模板类的成员
    cout << "T was set to double\n";
    guy.Show();
    cout << "V was set to T, which is double, then V was set to int\n";
    cout << guy.blab(10, 2.3) << endl;//U是int类型,因此返回值也为int类型
    cout << "U was set to int\n";
    cout << guy.blab(10.0, 2.3) << endl;//U是double类型,因此返回值也为double类型
    cout << "U was set to double\n";
    std::cout << "template_member Bye*********************************************************\n";
}
​
#endif

main.cpp

/*
Project name :          _12template
Last modified Date:     2022年5月6日11点33分
Last Version:           V1.0
Descriptions:           成员模板
*/
#include "main.h"
​
int main()
{
    cout << "成员模板************************************************************************" << endl;
    template_member();
    return 0;
}

12.9.3 运行结果

成员模板************************************************************************
template_member Hello**********************************************************
T was set to double
3.5
3
V was set to T, which is double, then V was set to int
28
U was set to int
28.2609
U was set to double
template_member Bye*********************************************************
​
D:\Prj\_C++Self\_12template\Debug\_12template.exe (进程 11528)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

##

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jasmine-Lily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值