12

我正在检查clampin boost 的实现:

  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

4

1 回答 1

15

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

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

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

于 2014-11-12T11:10:06.863 回答