Ho una funzione template in cui un tipo enum viene convertito nel suo tipo sottostante che funziona bene, ma ho scritto un overload che dovrebbe prendere un numero intero e restituire se stesso e dare un errore che int non è un tipo di enumerazione. Nel mio modello, questo dovrebbe essere stato filtrato. Che c'è?"Conversion" dal tipo allo stesso tipo sta causando l'errore
Ecco il codice del modello:
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<!std::is_enum<TT>::value, TT>::type
{
return t;
}
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<std::is_enum<TT>::value, typename std::underlying_type<TT>::type>::type
{
return (typename std::underlying_type<TT>::type)t;
}
Non so se 'underlying_type' è SFINAE-friendly, ma c'è una [soluzione] (http://coliru.stacked-crooked.com/a/e7f1dd3b75c8d9c2) per quel –
Cosa? Vedo che funziona, ma cosa sta succedendo qui che lo fa funzionare? E perché non dovrebbe il 'underlying_type' di SFINAE essere amichevole? – Adrian
L'istanziazione di 'std :: underlying_type :: type' è posticipata, in modo che' enable_if' possa fallire per primo. Con * SFINAE-friendly * Intendo dire che ogni errore di sostituzione avviene solo nel contesto immediato (se accade all'interno di 'underlying_type' stesso non è compatibile con SFINAE). –