计算机函数:有一个输入,有一个输出
数学函数:输入相同,结果相同,一种稳定的映射关系
在计算机里函数有可能会调用全局变量,所以即使参数一样,当全局变量发生变化时候,也会出现结果不一样
元函数:这里可以认为和数学函数一样的定义一样,元函数会在编译期被调用和执行,由于编译期只能处理常量或者类型,所以编译期使用的必须是元函数,一种没有副作用(输入一样的话输出一样)的函数。下面就是一个元函数。
constexpr int foo(int a)
{
return a + 1;
}
这里的constexpr是C++11的关键字,表示这个函数可以在编译期被调用,如果去掉,即使是无副作用的函数,也无法在编译期使用。下面是一个反例:
static int num = 3;
constexpr int foo(int a)
{
return a + (num++);
}
上面这段程序其实在编译的时候就会报错,因为这个函数有副作用,所以不可能是元函数,加上constexpr的话会在编译的时候报错。
元函数分类- 数值元函数
上面的元函数就是数值元函数,顾名思义就是返回的结果是数值 - 类型元函数
类型元函数,就是返回的结果是类型,比如下面的代码:
templatestruct Foo_ { typedef type T; } Foo_ ::type a = 1;
上述代码中,返回值是Foo_
由于上述代码每次写的时候都要写::type, 这个大佬们觉得不好看,为此又包装了一下:
templateusing Foo = typename Foo_ ::type; //demo Foo a = 1;
对于这种写法,确实看起来比较简洁,但是对于小白而言也比较疑惑,可能没有见过类似的模板写法,一般是模板函数,模板类,这个模板using/typedef 第一次见,记住就行了,理论上上述写法也是一个元函数,只是没有函数名和大括号而已,后面还会多次见到,要熟悉,比如下面的写法:
template元函数进阶//数值模板,这个要知道 constexpr int Add = a + b; // 也是数值元函数 //demo constexpr int x = Add<1, 3>;//这个在编译阶段就会处理好
元函数除了可以传入数值,类型以外,还可以传入模板,数值,类型,模板统一称为『元数据』。一个简单的小代码如下:
template class T1, typename T2>
struct F_
{
using type = typename T1::type;
}
//简化
template class T1, typename T2>
using F = typename F_::type;
//demo
F a = 1;
好好理解一下上面代码的含义。此外模板除了作为输入,还可以作为输出,有兴趣的可以自己查阅相关资料,这里不再阐述。



