新手光能
王牌小课堂 - 模板元编程(上)
模板元编程是在编译时间做计算的编程,相当于一切发生在编译时间
在做题里,编译时间是不算在运行时间内的
在游戏里,增加编译时间比增加运行时间好,只要你不公布源码
当然,模板元编程也有一些弊端,那就是,不能处理运行阶段的输入数据
模板元编程是意外功能,这将导致代码十分丑陋
现在进入正题:
一、常变量
template<int n>
struct ConstVar
{
static constexpr int value=n;
}
用法:
ConstVar<5>::value==5
一般不需要,可以直接用字面量表示
二、常列表
template<int... n>
struct list{}
暂时无法访问每个元素,但可以判断两个列表是否一样:
typeid(list<...>)==typeid(list<...>)
其中,往...的位置填数
三、元函数
这和普通C++函数不一样,这是数学函数
template<参数列表,只能是int类型>
struct MetaFunc
{
static constexpr int value=计算值的式子;
}
举例:
f(x)=x*x
template<int x>
struct MetaFunc
{
static constexpr int value=x*x;
}
四、递推
准确来说应该是用递归实现递推,但是这是在编译时间,时间长短无所谓
必须举例说明,就斐波那契数列吧
template<int n>
struct Fib
{
static constexpr int value=Fib<n-2>::value+Fib<n-1>::value;//递推式
}
template<>
struct Fib<1>//处理边界情况
{
static constexpr int value=1;
}
template<>
struct Fib<2>
{
static constexpr int value=1;
}
用法:
cout<<Fib<第几个数>::value;
这次我们的小课堂就讲到这,我们下次再见!
初级启示者
我对这个模板元最不爽的就是编译器有那啥可恶的模版递归深度限制,(我家电脑)超过900就报错
薛乘志在2022-04-30 20:32:15追加了内容
纠正一点:
template<参数列表,只能是int类型>
不正确,应为只能是C++中的基本类型(int, bool, float 等),用户/**自定义的类型不能为参数类型(如string)
C++20以后,自定义的可在编译期处理的类型可以作为参数类型使用