C++ 的MetaProgramming 入门篇(2)

本文介绍了如何在C++中实现元编程的条件选择模板,通过`if_`模板结构,根据条件返回不同的类型。文章通过一个`safe_fac`模板结构,演示了如何在编译时进行条件判断,避免运行时错误。文章还提到了Boost的mpl库和Modern C++ Design中的Typelist概念,探讨了元编程的深入应用。
摘要由CSDN通过智能技术生成

上回说到一个fac的版本, 希望在负数的情况下返回-1, 而不是无限递归下去.
还是按照我们的思维, 先写个对应"运行时世界"的版本.

int safe_fac(int n)
{
  if( n < 1)
     return -1;
  return fac(n);
}

这个if逻辑很简单, 如果模板参数<1, 那么直接返回 -1, 否则 还是使用前面的fac那个版本.
好, 转换成我们的meta 版本.

你想,用个 ?: 运算符不就解决了吗?

template<int n>
struct safe_fac
{
  enum { value =  (n < 1 ? -1 : fac<n>::value ) };
};

可惜不对,  ?= 只有在"运行时世界"才能使用. 那么 value 后面的???写什么好呢?

先轻松轻松, 写一个if的meta 版本, 我敢保证你能看得懂.
template< bool b , class T, class U>
struct if_
{
  typedef T type;
};

注意了, 如果以前我们提到的例如sum_, fac等meta functions(其实就是c++中的模板类, 称之为meta function是因为它们就像是function)
是通过一个 在enum中的value 返回整形的话, 上面刚刚的if_这个例子就展示了 meta中的另外一个武器, 通过typedef 一个type 返回一个类型.

如果我们这样调用
if_<true, int, double>::type  的结果就是 int 类型, 注意是"类型", 不是对象.

我们想在b为false的时候返回第

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值