跟我学c++高级篇——模板元编程之九宏和元编程

一、宏和元编程

在前面的元编程系列文章中,对宏和元编程有过初步的分析,后来觉得还是有必要把二者专门拿出来进行一次分析说明。为什么这样做呢?首先,在很多的涉及到元编程的库里,都可以看二者结合使用,达到一个更好的设计实现,换句话说就是实践是根本;宏和元编程在某些道理上是相通的。一涉及到道理,有的时候儿就不好说清楚,因为每个人对道理的理解均有不同,所以大家多写写代码,慢慢就明白了。
宏是一种单纯的替换,是一种预处理的指令。元编程则是利用模板实现的一种编程实现“编程”的方式。它们两种都在编译期内运行。其实从宏观上来讲,宏和元编程都是实现元编程的方式,这么讲可能有些让人误解,第一个元编程指的是模板的元编程,第二个元编程是宏观上的元编程。

二、二者的关系

老的程序员可能都读过MFC中利用宏动态生成类和对象的方法,很复杂而又精巧,但确实管用。只不过太过复杂意味着更大多数人只能看着这种情况叹息,更多的公司请不起也维护不起这种程序。模板的元编程又何偿不是呢?国外不敢说,国内的公司使用c++编程的,能广泛应用模板编程的就很少,模板元编程就更少之又少了。
刚刚说了,宏只是单纯替换,这种功能模板元编程也是可以做到的。但是,模板元编程除了替换,它还可以进行运算,更重要的是,在元编程可以进行各种“限定”。这其实极大的丰富了元编程的语法,使其更接近于正常的编程,这样就更为编程人员所接受。
元编程利用模板编程,所以其在一些对外应用上,一定是带有各种相对复杂的类型和参数,这就让只是应用的一些开发人员产生困惑,即使有例程,估计也会感觉麻烦。但如果在元编程上套上一层宏,那么从学开发开始就接触的宏,是很容易为开发者接受的。而且,确实这层宏可以极大的降低对元编程的理解。

三、例程

这里只举一个简单的例子供大家分析:

template<bool B, typename T, typename F> struct MyCondition;

template<typename T, typename F>
struct MyCondition<true, T, F>
{
    using R = T;
};

template<typename T, typename F>
struct MyCondition<false, T, F>
{
    using R = F;
};

#define __if__(...) typename MyCondition<__VA_ARGS__>::R

//用法
template<typename T>
using NewType =  __if__ (false, HaveEx<T>, NoHaveEx<T>) ;

这个例子类似于std::conditional的实现,外面实现了一层宏定义。如果内部嵌套更复杂的模板元编程,使用宏定义可能会更简单直白一些。

四、总结

宏和元编程中,宏的入门相对要简单很多,虽然宏的技巧性更让人迷惑,但一般用到的还是定义变量或者简单的一个表达式的应用。而元编程相对要复杂一些,因为首先要明白一些模板的基本知识。其实在应用一些技巧时慢慢会发现,都是对基础知识的灵活运用,甚至是一些意外的副作用的利用。技巧跟理论不同在于,技巧如果有人指点,可能瞬间明白;而理论需要一个较长期的学习然后才能进行应用。
宏编程更倾向于技巧性而模板元编程二者兼俱。

猜你喜欢

转载自blog.csdn.net/fpcc/article/details/129352225