2016-08-12 14 views
6

Wystarczy krótki pytanie podana funkcja, gdzie chcę, aby powrócić do podstawowych type enum class:C++ std :: enable_if warianty ograniczające i problemy

Dlaczego ta wersja działa dobrze

template<typename T> 
constexpr inline 
typename std::enable_if_t< 
    std::is_enum<T>::value, 
    typename std::underlying_type_t<T> 
> 
enumValue(T p_rVal) noexcept 
{ 
    return static_cast<typename std::underlying_type_t<T>>(p_rVal); 
} 

if (enumValue(myEnumClass) == 0) {} 

niniejsza awarii jednego z "nie pasującej funkcji przeciążony znaleźć" (VS 2015) błąd:

template< 
    typename T, 
    typename std::enable_if_t< 
    std::is_enum<T>::value, 
    typename std::underlying_type_t<T> 
    > 
> 
constexpr inline 
typename std::underlying_type_t<T> 
enumValue(T p_rVal) noexcept 
{ 
    return static_cast<typename std::underlying_type_t<T>>(p_rVal); 
} 

podziękowaniem s dużo za pomoc!

+0

@ DAN Dlaczego odrzuciliście proponowaną zmianę przez Torbjörna? Ma to sens, aby poprawić formatowanie tego postu. – Walter

+0

Nie potrzebujesz 'typename' przed' std :: underlying_type_t '. – Oktalist

+0

Tak, dobrze, przewaga C++ 14. Już je usunąłem, ale mimo to dziękuję za podpowiedź! – gilgamash

Odpowiedz

2

W pierwszym przykładzie jest tylko jeden parametr template, T, który w wywołaniu funkcji enumValue(myEnumClass) wywodzi się z argumentu. Jest to poprawne użycie std::enable_if_t<>.

W twoim drugim przykładzie są dwa parametry: template i można ponownie wyprowadzić pierwszy, ale nie drugi. Jest to niewłaściwy/niewłaściwy sposób użycia std::enable_if_t<>.

+0

AH! Tak, próbowałem, dla drugiej wersji, szablon > i działa dobrze! Dzięki za (teraz zaakceptowaną) odpowiedź! – gilgamash

+1

Yup, domyślny szablon jest tutaj. Nie zaśmieca podpisu funkcji i pozwala na użycie dedukcji typu "auto". – Oktalist