Не выводимый контекст, такой как 'boost :: mpl :: identity <T>:: type' в стандартной библиотеке? - PullRequest
0 голосов
/ 09 сентября 2018

Cosider в следующем примере я выкопал здесь, на StackOverflow

  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;
  } 

где typename boost::mpl::identity<T>::type не позволяет компилятору выводить T на основе типа второго и третьего аргумента. Это очень удобно для меня, но я не могу использовать Boost Library (пожалуйста, не беспокойте меня об этом, потому что это уже трудное время из-за этого).

Вопрос теперь в том, что прямо в стандартной библиотеке что-то эквивалентное, чего я просто не могу найти?

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

boost::mpl::identity - довольно простой шаблон, который предоставляет только type, идентичный предоставленному параметру шаблона.

Это может быть реализовано следующим образом:

template <typename X>
struct identity
{
    typedef X type;
};
0 голосов
/ 09 сентября 2018

C ++ 20 будет иметь std::type_identity. Но вам не нужно ждать, пока стандартная библиотека его получит. Вся его реализация:

template< class T >
struct type_identity {
    using type = T;
};

template< class T >
using type_identity_t = typename type_identity<T>::type;
0 голосов
/ 09 сентября 2018

std::common_type_t<T> работает. Из cppreference :

Если sizeof...(T) равен единице (т. Е. T ... содержит только один тип T0), тип члена присваивает тот же тип, что и std::common_type<T0, T0>::type, если он существует; в противном случае тип члена отсутствует.

Таким образом, std::common_type_t будет работать для этого

...