我正在检查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
吗?
答案 0 :(得分:14)
嵌套名称说明符会创建非推断的上下文。因此,编译器不会尝试根据声明为的第二个和第三个参数推导出类型T
:
typename boost::mpl::identity<T>::type const &
类型T
将仅基于第一个参数的类型推断出,然后用于实例化其余参数的类型。使用identity
类型是防止某些参数上的模板参数类型推导的常见技巧,否则在参数类型不同的情况下会导致模糊的调用错误,但使用相同的类型模板参数。有时也可以不让编译器自动推断类型,并强制调用者自己做。