En el siguiente ejemplo, desenterré aquí en 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;
  } 

Donde typename boost::mpl::identity<T>::type evita que el compilador deduzca T en función del tipo del segundo y el tercer argumento. Esto me resulta muy útil, pero no puedo usar el Boost Library (por favor, no me lo pongas difícil, ya que es un momento difícil por eso).

La pregunta ahora es algo equivalente en la biblioteca estándar directamente que simplemente no puedo encontrar.

0
user32434999 9 sep. 2018 a las 02:56

3 respuestas

La mejor respuesta

C ++ 20 tendrá std::type_identity. Pero realmente no tiene que esperar a que la biblioteca estándar lo tenga. Toda su implementación es:

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

template< class T >
using type_identity_t = typename type_identity<T>::type;
3
Barry 9 sep. 2018 a las 04:16

std::common_type_t<T> funciona. De cppreference:

Si sizeof...(T) es uno (es decir, T ... contiene solo un tipo T0), el tipo de miembro nombra el mismo tipo que std::common_type<T0, T0>::type si existe; de lo contrario no hay tipo de miembro.

Por lo tanto, std::common_type_t funcionará para esto

0
Justin 9 sep. 2018 a las 00:00

boost::mpl::identity es una plantilla bastante sencilla que solo proporciona un type idéntico al parámetro de plantilla proporcionado.

Se puede implementar de la siguiente manera:

template <typename X>
struct identity
{
    typedef X type;
};
2
kmdreko 9 sep. 2018 a las 00:41