栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++14变量模板

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++14变量模板

如果对模板或者C++标准感兴趣的开发者们相信都不会对变量模板感到陌生,我们今天就讲一讲变量模板

从C++14 开始,变量也可以被某种类型参数化。称为变量模板。

例如可以通过下面的代码定义pi,但是参数化了其类型:

template//我们写作默认int 
T pi{};//初始化列表 为0
int main()
{
	std::cout.precision(16);
	pi = 20;//pi<>=20;效果一样
	std::cout << pi << std::endl; //20
	pi = 3.14159265358;
	std::cout << pi << std::endl;//3.14159265358
	std::cout << pi << std::endl;//0
	return 0;
}

注意,和其它几种模板类似,这个定义不要出现在函数内部或者块作用域内部。

那么我们这样使用它,它是什么?我们没有创建局部变量,注意,它不是局部变量,这是一个全局变量,我们这个过程是实例化了一个全局变量。

而且我们必须显性声明模板参数。

我们讲讲它的一些用处

打个比方,如果要使用一个类的静态数据,必须像下面这样调用

#include
#include
template
class MyClass {
public:
	static constexpr int max = 1000;
};

int main(){
    MyClass::max;
}

得加上作用域解析运算符,但是,有了变量模板之后,我们可以

#include
#include
template
class MyClass {
public:
	static constexpr int max = 1000;
};
//这意味着对于一个标准库的类:
template
int myMax = MyClass::max;
namespace std {
	template
	class numeric_limits {
	public:
		
			static constexpr bool is_signed = false;
		
	};
}
//可以定义:
template
constexpr bool isSigned = std::numeric_limits::is_signed;
int main(){
    //应用工程师就可以使用下面这样的代码:
	auto i = myMax;
	std::cout << i << std::endl;
	//而不是:
	//auto i = MyClass::max;
	//std::cout << i << std::endl;
    system("pause");
	return 0;
}

熟悉标准库的开发者,对于#include不会陌生,我们举两个简单的例子

template
auto func(T& a) {
	std::cout << typeid(a).name() << " ";
	if (std::is_array_v) {
		std::cout << "是数组" << std::endl;
	}
	else
		std::cout << "不是数组" << std::endl;
}

template
auto func2(T& v) {
	std::cout << typeid(v).name() << " ";
	if (std::is_const_v) {
		std::cout << "是const" << std::endl;
	}
	else
		std::cout << "不是const" << std::endl;
}

这第一种相当于使用了变量模板,也有不使用的写法

template
auto func(T& a) {
	std::cout << typeid(a).name() << " ";
	if (std::is_array::value) {
		std::cout  << "是数组" << std::endl;
	}
	else
		std::cout << "不是数组" << std::endl;
}

template
auto func2(T& v) {
	std::cout << typeid(v).name() << " ";
	if (std::is_const::value) {
		std::cout << "是const" << std::endl;
	}
	else
		std::cout << "不是const" << std::endl;
}

发现了吗?第二种相当于我们一开始介绍的使用作用域解析运算符来取出的值,标准委员会保留老式的写法,但是也更新形式的方法,大家理解即可。

仅供参考,如有错误还请指正

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873220.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号