C++模板元入门(入坑)体验

其实我也不知道这能不能算入门,只能说看了之后大体上能有一个概念。如果有同学大作业是拿着俄罗斯方块的单机来做双人对战,可以尝试用模板元做。

之前在知乎(逼乎)上看到关于程序员不为人知的禁术的话题,手滑点开看到一个c++模板元编程,说是C++的最高级禁术,也有人说它是黑魔法,但不管怎样,应该是黑科技的那一种,而黑科技都是很具有诱惑力的。

刚入门(入坑),了解肯定不详细,先把这阶段的学习记下来,以后再慢慢修正完善,有什么错误也请大家指正。


总的来说模板是用来进行代码复用的,代码复用当然是为了简化工作的啦!C++搞个类出来,很猛,但依旧没有展现出与结构体相比的编码速度方面的巨大优势(private类型什么的在此不作考虑),主要还是要复用,要让人写起来爽,最好不写,让代码自动生成代码(Haskell?),函数式越来越重要,这也是称它为禁术的原因吧,让机器去做简单的工作,写简单的代码,代替那些几个小时零基础速成的low程序员失业是理所当然的事,毕竟编程是很神圣的。
//贴个经典的利用模板元求阶乘的代码,体验一下模板元
template<int N>
class Factorial
{
public:
    enum
    {
        _result = N * Factorial<N-1>::_result
    };
};

//用于结束递归规则的特化模板
template<>
class Factorial<0>
{
public:
    enum
    {
        _result = 1
    };
};

int main()
{
    const int Num = 10;
    cout << Num << "! = " << Factorial<Num>::_result << endl;
}
应用当然是自动补全和编译时计算啦,程序运行的开销转移到编译了,C++11好像为模板元专门改了点,有兴趣请自行百度。
但我一直好奇这个运行开销转移到负载,不是会增加编译时间吗,不懂了,与脚本的做法相反,这样做是能提升性能,但那我看现在脚本发展这么6,好像性能不太被重视啊,唔。。
性能方面具体怎么优化呢,比方说按小于N循环输出函数值,我有时候知道N的具体值,这时候我直接把N写入循环,性能是不是比定义变量最后在函数引用时赋值好?因为可以分支化,还可以优化数据缓存。但我又避免不了很少情况下这个N要变,这就不能两全了。
贴一份代码,转自知乎大神,大家也可以自己尝试写一写,主要我怕我写不规范误导大家,以后再贴
template<int count>
class Copy
{
public:
 static inline go( float* const out , float* const in ,int i)
 {
  Copy<count - 1>::go( out , in , i );
  out[count][i-1] = in[count][i];
 }
};

template<>
class Copy<0>
{
public:
 static inline go( float* const, float* const, int)
 {}
};
上面转了一份我觉得比较代表性的方式去解决这个问题
template<int N>
void palll_copy(float** out,float** in,size_t length)
{
    for(size_t i=0;i<length;++i) {
        Copy<N>::go(out,in,i);
    }
}
这样我就可以依据N的值的不同创建出相应代码了。
有时候代码是门玄学,我就有经历过这个变量引用莫名其妙出问题,随便瞎改改就好了的情况,但我想上例中的模板方式会有所帮助。

实际应用时Boost用了很多,以后补。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值