◐ Shell
clean mode source ↗

std::enable_if - cppreference.com

Da cppreference.com.

Questa pagina è stata tradotta in modo automatico dalla versione in ineglese della wiki usando Google Translate.

La traduzione potrebbe contenere errori e termini strani. Muovi il puntatore sopra al testo per vedere la versione originale. Puoi aiutarci a correggere gli gli errori. Per ulteriori istruzioni clicca qui.

Click here for the English version of this page

<metanoindex/>

<tbody> </tbody>

Elemento definito nell'header

<type_traits>

template< bool B, class T = void > struct enable_if;

(dal C++11)

Se B è true, std::enable_if ha un type membro pubblico typedef, pari a T, altrimenti, non vi è nessun membro typedef.

Original:

If B is true, std::enable_if has a public member typedef type, equal to T; otherwise, there is no member typedef.

The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Questo MetaFunction viene utilizzato per rimuovere in modo condizionale funzioni e le classi di risoluzione sovraccarico sulla base di caratteri morfologici e per fornire overload della funzione separati e specializzazioni per i tratti di tipo diverso. std::enable_if può essere usato come un argomento di funzione aggiuntiva (non applicabile ai overload dell'operatore), come un tipo di ritorno (non applicabile ai costruttori e distruttori), o come un modello di classe o un modello di parametro di funzione.

Original:

This metafunction is used to conditionally remove functions and classes from overload resolution based on type traits and to provide separate function overloads and specializations for different type traits. std::enable_if can be used as an additional function argument (not applicable to operator overloads), as a return type (not applicable to constructors and destructors), or as a class template or function template parameter.

The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Membri tipi

Tipo

Original:

Type

The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Definition
type

T sia o no tale membro, a seconda del valore di B

Original:

either T or no such member, depending on the value of B

The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Possibile implementazione

template<bool B, class T = void>
struct enable_if {};

template<class T>
struct enable_if<true, T> { typedef T type; };

Esempio

#include <type_traits>
#include <iostream>

// foo1 overloads are enabled via the return type
template<class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type 
    foo1(T t) 
{
    std::cout << "foo1: float\n";
    return t;
}

template<class T>
typename std::enable_if<std::is_integral<T>::value, T>::type 
    foo1(T t) 
{
    std::cout << "foo1: int\n";
    return t;
}

// foo2 overload is enabled via a parameter
template<class T>
T foo2(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0) 
{
    return t;
}

// foo3 overload is enabled via a template parameter
template<class T ,
         class = typename std::enable_if<std::is_integral<T>::value>::type >
T foo3(T t) // note, function signature is unmodified
{
    return t;
}

// A is enabled via a template parameter
template<class T, class Enable = void>
class A; // undefined

template<class T>
class A<T, typename std::enable_if<std::is_floating_point<T>::value >::type> {
};

int main()
{
    foo1(1.2); // OK, calls the first version of foo1()
    foo1(10); // OK, calls the second version of foo1()

//  foo2(0.1); // compile-time error
    foo2(7); // OK

//  A<int> a1; // compile-time error
    A<double> a1; // OK
}

Output:

Vedi anche