C++11 模板元编程(2)-元函数、高阶函数

转载https://www.jianshu.com/p/b56d59f77d53

所谓元编程,就是指可以产生程序的程序。由于模板的计算发生在“运行时C++”的前面,它可以为“运行时C++”产生代码,所以称之为模板元编程

1.元函数 :编译期进行计算,编译期的函数,目的是为了支持C++模板元编程。为了和C++运行时函数进行区分,后文中我们统一将其称作元函数

template<typename T>
struct PointerOf
{
    using Result = T*;
};

template<typename T>
struct Pointer2Of
{
    using Result = typename PointerOf<typename PointerOf<T>::Result>::Result;
};

int* pi;
Pointer2Of<int>::Result ppi = &pi;

#define __pointer(...) typename PointerOf<__VA_ARGS__>::Result

template<typename T>
struct Pointer2Of
{
    using Result = __pointer(__pointer(T));
};

 2.高阶函数 :

一个可以接收一个元函数做参数的元函数,在函数式编程里面这称作高阶函数。高阶函数可以让代码在更高的抽象层次上进行组合复用

template<int N, typename T, template<typename> class Func>
struct Times
{
    using Result = typename Func<typename Times<N - 1, T, Func>::Result>::Result;
};

template<typename T, template<typename> class Func>
struct Times<1, T, Func>
{
    using Result = typename Func<T>::Result;
};

int*** pppi;
Times<4, int, PointerOf>::Result ppppi = &pppi;

内部元函数使用了模板特化 

template<typename T, typename U>
struct InnerFunc
{
    // 主版本实现
};

template<typename T>
struct InnerFunc<T, T>
{
    // 特化版本实现
};

template<typename T>
struct OuterFunc
{
    template<typename U, typename V>
    using Result = InnerFunc<U, V>;
};

允许函数的返回值也是函数 

template<typename T>
struct OuterFunc
{
    template<typename U, typename V>
    struct Result
    {
        // ...
    };
};

OuterFunc<int>::template Result;    // OuterFunc的返回值函数,这里只能用template
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值