C++C++2.0

模板元编程

2018-11-26  本文已影响6人  梅花怒

什么是模板元

模板元编程是一种编译期计算的编程方法。如果你学过任意一门函数式的编程语言,那么你对模板元编程的理解一定是非常容易的。


模板元的编程约定

template <template_args>
struct func
{
    do_something;
    using type = return_type;
};

对于一个元函数func,其template_args是func的参数,type是func的返回值。当然了,元函数的参数可以为空,即func是一个普通的struct而不是一个模板类,这也是元函数。

template <int N>
struct Int
{
    using type = Int<N>;
    static const int value = N;
};
struct func_class
{
    template <template_args>
    struct apply
    {
        do_something;
        using type = return_type;
    };
};

我们约定,元函数类中包裹的元函数叫做apply。


如何编写模板元

记住这几个Tips:

1.对于临时变量,我们可以用类型存储。这也是为什么我们建议用Int外覆类而不是int类型值的原因之一。

2.对于循环,循环对于一门语言来说其实是不必要的,可以用循环实现的一定可以用递归实现。所以慢慢习惯递归的写法,就会很自如地编写模板元程序了。

3.对于数据结构的处理,千万别妄想自己可以in-place的处理数据结构。当对数据进行修改之后,要想着构造并返回新的数据结构。

4.对于数据结构的实现,如果你熟悉Lisp的话,那么用模板元编程很容易去实现Cons,而且模板元编程还可以实现比Cons更方便的数据结构。如果你熟悉Haskell的话,其实Haskell的[a]就是Cons的语法糖。

模板元编程的具体使用方法可以参见我的文章,希望对你有启发。


Modern C++下的模板元编程

首先,可变模板参数、constexpr、if constexpr等等特性是极大地方便模板元编程的编写的,一些简单的模板元编程甚至可以用模板函数来实现,而不是模板类。当然了,对于复杂的模板元编程还是需要模板类的,因为偏特化的强大模式匹配功能是模板函数所不能替代的,除非在模板函数的参数列表中用各种标签,然而这得不偿失,很不优雅。

上一篇下一篇

猜你喜欢

热点阅读