Я проверял реализацию 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
?
вложенное имя спецификатор создает не выводимый контекст. Следовательно, компилятор не будет пытаться определить тип T
на основании второго и третьего параметров, объявленных как:
typename boost::mpl::identity<T>::type const &
Тип T
будет выводиться только на основе типа первого аргумента, а затем использоваться для создания экземпляров типов остальных параметров. С использованием identity
Тип — это обычная уловка, предотвращающая вывод типа аргумента шаблона для определенных параметров, который в противном случае привел бы к неоднозначной ошибке вызова в случае, если типы аргументов различаются, но используют один и тот же параметр шаблона типа. Иногда может также потребоваться, чтобы компилятор автоматически не определял тип и не вызывал гость сделай это сам.