转载: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