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

1.元函数与type

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

1.元函数与type

元函数

计算机函数:有一个输入,有一个输出
数学函数:输入相同,结果相同,一种稳定的映射关系

在计算机里函数有可能会调用全局变量,所以即使参数一样,当全局变量发生变化时候,也会出现结果不一样

元函数:这里可以认为和数学函数一样的定义一样,元函数会在编译期被调用和执行,由于编译期只能处理常量或者类型,所以编译期使用的必须是元函数,一种没有副作用(输入一样的话输出一样)的函数。下面就是一个元函数。

constexpr int foo(int a)
{
	return a + 1;
}

这里的constexpr是C++11的关键字,表示这个函数可以在编译期被调用,如果去掉,即使是无副作用的函数,也无法在编译期使用。下面是一个反例:

static int num = 3;
constexpr int foo(int a)
{
	return a + (num++);
}

上面这段程序其实在编译的时候就会报错,因为这个函数有副作用,所以不可能是元函数,加上constexpr的话会在编译的时候报错。

元函数分类
  • 数值元函数
    上面的元函数就是数值元函数,顾名思义就是返回的结果是数值
  • 类型元函数
    类型元函数,就是返回的结果是类型,比如下面的代码:
template 
struct Foo_ 
{
	typedef type  T;
}
Foo_::type a = 1;

上述代码中,返回值是Foo_::type, 输入是int,所以模板类就是一种元函数。
由于上述代码每次写的时候都要写::type, 这个大佬们觉得不好看,为此又包装了一下:

template 
using Foo = typename Foo_::type;
//demo
Foo a = 1;

对于这种写法,确实看起来比较简洁,但是对于小白而言也比较疑惑,可能没有见过类似的模板写法,一般是模板函数,模板类,这个模板using/typedef 第一次见,记住就行了,理论上上述写法也是一个元函数,只是没有函数名和大括号而已,后面还会多次见到,要熟悉,比如下面的写法:

template      //数值模板,这个要知道
constexpr int Add = a + b; // 也是数值元函数
//demo
constexpr int x = Add<1, 3>;//这个在编译阶段就会处理好
元函数进阶

元函数除了可以传入数值,类型以外,还可以传入模板,数值,类型,模板统一称为『元数据』。一个简单的小代码如下:

template