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类型是防止某些参数上的模板参数类型推导的常见技巧,否则在参数类型不同的情况下会导致模糊的调用错误,但使用相同的类型模板参数.有时也可以不让编译器自动推断出类型,并强制调用者自己做.