Какой смысл в & quot; boost :: mpl :: identity & lt; T & gt; :: type & quot; Вот?

Я проверял реализацию 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?

11

Решение

вложенное имя спецификатор создает не выводимый контекст. Следовательно, компилятор не будет пытаться определить тип T на основании второго и третьего параметров, объявленных как:

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

Тип T будет выводиться только на основе типа первого аргумента, а затем использоваться для создания экземпляров типов остальных параметров. С использованием identity Тип — это обычная уловка, предотвращающая вывод типа аргумента шаблона для определенных параметров, который в противном случае привел бы к неоднозначной ошибке вызова в случае, если типы аргументов различаются, но используют один и тот же параметр шаблона типа. Иногда может также потребоваться, чтобы компилятор автоматически не определял тип и не вызывал гость сделай это сам.

14

Другие решения


По вопросам рекламы [email protected]