6

Il seguente codice non viene compilato e non riesco a capire perché.Utilizzo sizeof ... all'interno di std :: enable_if

template <class T, class... Ts> 
typename std::enable_if<sizeof...(Ts) > 0>::type func() { 
    // nop 
} 

Il messaggio di errore prodotta è:

error: expected unqualified-id before numeric constant 
typename std::enable_if<sizeof...(Ts) > 0u>::type func() { 
             ^

risposta

11

È necessario parentesi per questo di essere analizzato correttamente dal compilatore:

template <class T, class... Ts> 
typename std::enable_if<(sizeof...(Ts) > 0)>::type func() { 
         ^    ^
    // nop 
} 
+0

può fare un spiegazione, per favore? – Incubbus

+0

@Incubbus Spiego la logica e fornisco una soluzione intelligente nella mia risposta –

9

Il compilatore interpreta la staffa ad angolo retto (>) come parentesi di chiusura per std::enable_if. Ciò accade perché una volta che inizi un elenco di parametri (o argomenti) del template, la prima volta che il compilatore ha la possibilità di chiuderlo (con >), lo fa.

Soluzione (che dimostra il punto di cui sopra): Non chiudere l'elenco dei parametri, invertire la condizione e utilizzare una parentesi angolare sinistra:

template <class T, class... Ts> 
typename std::enable_if< 0 < sizeof...(Ts) >::type func() {} 
//      ^compilers are cool with this 

Demo