&#34; boost :: mpl :: identity <t> :: type&#34;的重点是什么?这里?</T>

时间:2014-11-12 10:55:35

标签: c++ templates boost argument-deduction

我正在检查boost中的clamp的实现:

  template<typename T, typename Pred> 
  T const & clamp ( T const& val, 
    typename boost::mpl::identity<T>::type const & lo, 
    typename boost::mpl::identity<T>::type const & hi, Pred p )
  {
//    assert ( !p ( hi, lo ));    // Can't assert p ( lo, hi ) b/c they might be equal
    return p ( val, lo ) ? lo : p ( hi, val ) ? hi : val;
  } 

如果我查阅文档,identity将保持模板参数不变。

  

身份元功能。返回X不变。

那么在这里使用它有什么意义呢?

typename boost::mpl::identity<T>::type不等同于T吗?

1 个答案:

答案 0 :(得分:14)

嵌套名称说明符会创建非推断的上下文。因此,编译器不会尝试根据声明为的第二个和第三个参数推导出类型T

typename boost::mpl::identity<T>::type const &

类型T将仅基于第一个参数的类型推断出,然后用于实例化其余参数的类型。使用identity类型是防止某些参数上的模板参数类型推导的常见技巧,否则在参数类型不同的情况下会导致模糊的调用错误,但使用相同的类型模板参数。有时也可以不让编译器自动推断类型,并强制调用者自己做。