C++函数模板、类模板、右值引用、万能引用、完美转发案例

如果能看懂以下示例,标题中的相关术语应该都能理解:
定义函数模板:

//E.h文件
#pragma once
#include<iostream>


//万能引用而非右值引用
template<typename T>
void print(T&&n)
{
	std::cout << n << std::endl;
}

template<typename T>
void print(T&n)
{
	std::cout << n << std::endl;
}

//函数模板涉及类型T推导,T&&是万能引用而非右值引用
//当n为左值时传递给T&&时,T会被推导为左值引用,
//此时触发引用折叠,T&& &->T&,此时实参与形参类别同为左值引用,因此可以传递左值引用--primerP609
template<typename T>
void printfun(T&&n)
{
	//n为左值,如果不进行完美转发总是会调用void print(T&n)
	//print(n);
	//完美转发,根据n情况选择调用函数
	print(std::forward<T>(n));
}

类模板

template<typename T>
class F
{
public:
	//类模板无需类型推导,T&&是右值引用
	void printfun(T&&n)
	{
		//虽然传进来的是右值,即允许右值实参绑定到形参右值引用,但形参右值引用是一个变量,变量即为左值
		//因此n为左值,总会调用void print(T&n)左值函数
		
		print(n);
		//转换右值调用void print(T&&n)右值函数
		print(std::move(n));
	}

	//
	void print(T&&n)
	{
		std::cout <<"void F:: print(T&&n)"<< n << std::endl;
	}

	void print(T&n)
	{
		std::cout << "void F:: print(T&n)" << n << std::endl;
	}
};

main函数

#include <iostream>
#include"E.h"
#include"F.h"
int main()
{
	int fs = 9;
	printfun(std::move(fs));
	printfun(fs);//形参是外能引用:实参可以为左值或右值
	F<int>f;
	f.printfun(std::move(fs));//形参是右值引用:实参必须为右值
	f.print(5);
	//f.printfun(fs);//编译错误

    std::cout << "Hello World!\n"; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值