这里的"boost :: mpl :: identity <T> :: type"有什么意义?

Kar*_*ath 11 c++ templates boost argument-deduction

我正在检查clampboost中的实现:

  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;
  } 
Run Code Online (Sandbox Code Playgroud)

如果我查阅文档,则identity返回模板参数不变.

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

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

typename boost::mpl::identity<T>::type等于T

Pio*_*cki 14

一个嵌套的名称说明符创建一个非推测的背景下.因此,编译器不会尝试T根据声明为的第二个和第三个参数推断类型:

typename boost::mpl::identity<T>::type const &
Run Code Online (Sandbox Code Playgroud)

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

  • +1一个nitpick:你可能想提一下,在非推导的上下文中使用嵌套的`:: type`允许在`hi`和`lo`上进行隐式转换,这在参数推断期间不予考虑.允许这样的混合参数类型将是这里的主要应用. (4认同)