正文

[笔记]enable_if的原理2008-02-16 02:34:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/32706.html

分享到:

enable_if是用来(可以用来)控制重载函数的是否可用,这一点没有直观感受,比如,我写了一个形式的重载函数,但是我需要在某种条件下取消它,这时候它就可以派上用场,当然这里是模板函数.

function的构造函数有类似下面的形式:

    template<typename Functor>
    BOOST_FUNCTION_FUNCTION(Functor BOOST_FUNCTION_TARGET_FIX(const &) f
#ifndef BOOST_NO_SFINAE
                            ,typename enable_if_c<
                            (boost::type_traits::ice_not<
                             (is_integral<Functor>::value)>::value),
                                        int>::type = 0
#endif // BOOST_NO_SFINAE
                            ) :
      function_base()
    {
      this->assign_to(f);
    }

#ifndef BOOST_NO_SFINAE
    BOOST_FUNCTION_FUNCTION(clear_type*) : function_base() { }
#else
    BOOST_FUNCTION_FUNCTION(int zero) : function_base()
    {
      BOOST_ASSERT(zero == 0);
    }

我还不知道如何分析和理解这些宏,这个BOOST_FUNCTION_FUNCTION会替换成你外面的名字function,这两个构造函数有些奇怪,比如:

function<int(int)> f=0;

对于第一个模板形式,虽然你知道那里的Functor表示仿函数,但是事实上编译器只能当成'某种类型',并且不会排除int,它会被选中嘛,当然啦,int也是一种typename.这是我们不想看到的,愚蠢地把0当成了函数对象初始化下面的内容.

这个时候,那句enable_if_c起作用了,它里面的意思是说,如果Functor不是内部类型,那第二个参数就是int型,且有默认参数0,否则,将产生参数推导错误,而这并不会引发编译错误,只是将这个推导错误的重载形式函数从候选集中去掉.

可以在boost/utility里找到enable_if.hpp,看到enable_if_c的定义很简单:

template <bool B, class T = void>
  struct enable_if_c {
    typedef T type;
  };

  template <class T>
  struct enable_if_c<false, T> {};

如果第一个参数是true,则内嵌型别type就是第二个参数,否则,没有type的定义.第二个参数会被选中的原因是,0可以转型成clear_type*.

阅读(8236) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册