Codice campione 1:differenza tra i parametri del template typename vs non typenames?
namespace detail {
enum enabler { dummy };
}
class foo {
public:
template <typename T,
typename std::enable_if<!std::is_integral<T>::value,
detail::enabler>::type = detail::enabler::dummy>
void func(T t) {
std::cout << "other" << std::endl;
}
template <typename T,
typename std::enable_if<std::is_integral<T>::value,
detail::enabler>::type = detail::enabler::dummy>
void func(T t) {
std::cout << "integral" << std::endl;
}
};
Esempio di codice 2:
namespace detail {
enum enabler { dummy };
}
class foo {
public:
template <typename T,
typename T2 = typename std::enable_if<!std::is_integral<T>::value, detail::enabler>::type>
void func(T t) {
std::cout << "other" << std::endl;
}
template <typename T,
typename T2 = typename std::enable_if<std::is_integral<T>::value, detail::enabler>::type>
void func(T t) {
std::cout << "integral" << std::endl;
}
};
capisco perché campione 2 non può essere compilato. Fondamentalmente perché entrambe le funzioni template sono uguali tra loro (hanno anche gli stessi parametri del modello T
, T2
).
Non capisco perché l'esempio 1 compili! Vedo che è lo stesso problema. Fondamentalmente invece di avere il secondo parametro template come typename
, è una enum
invece di una typename
questa volta.
Qualcuno può spiegare per favore?
Inoltre, ho eseguito il seguente codice e restituito vero che è ancora più confuso! (Senso che è vero, ma confondendo quel campione 1 compilazioni)
std::cout
<< std::boolalpha
<< std::is_same<std::enable_if<std::is_integral<int>::value, int>::type,
std::enable_if<!std::is_integral<float>::value, int>::type>::value
<< std::endl;
Questo in realtà non riguarda il requisito di 'typename' tanto quanto è una domanda su come funziona SFINAE. – Niall
Cosa c'è di sorprendente nell'ultimo bit? Abbiamo 'enable_if :: type', due volte. –
Barry