2010-09-02 15 views
11

Mi stavo chiedendo se ci fosse qualcosa nel C++ 0x std lib già disponibile per contare il numero di parametri in un pacchetto di parametri? Mi piacerebbe sbarazzarmi del field_count nel codice qui sotto. So che posso costruire il mio contatore, ma sembra proprio che questa sarebbe una cosa ovvia da includere nella DLL std di C++ 0x, e volevo essere sicuro che non fosse già lì :) Implementazioni contatore interne sono i benvenuti ancheNumero di parametri in un pacchetto di parametri? Esiste una funzione lib di std di C++ 0x per questo?

template<const int field_count, typename... Args> struct Entity { 
    const tuple<Args...> data; 
    const array<const char*, field_count> source_names; 

    Entity() : data() { 
    } 
}; 
+1

duplicati di [? Come trovare la lunghezza di un pacchetto di parametri] (http://stackoverflow.com/questions/2770474/ how-to-find-the-length-of-a-parameter-pack) Sapevo di aver imparato "sizeof ..." da una risposta qui ... –

+0

In realtà l'ho letto prima di pubblicare questa domanda, ma basato nella lettura rapida ho fatto, non ero sicuro che stavano ottenendo il numero effettivo di parametri rispetto alla dimensione totale di tutti i parametri. Lol, la mia domanda mi piace di più, per me è più chiaro :) –

risposta

27

Sì, è possibile utilizzare sizeof.... Da FCD C++ 0x (§5.3.3/5):

L'identificatore in un'espressione sizeof... deve nominare un pacchetto di parametri. L'operatore sizeof... restituisce il numero di argomenti forniti per l'identificatore del pacchetto di parametri. Il pacchetto parametri è espanso (14.5.3) dall'operatore sizeof.... [Esempio:

template<class... Types> 
struct count { 
    static const std::size_t value = sizeof...(Types); 
}; 

- fine esempio]

+0

Mi piace essere in grado di usare sizeof in questo modo, ma ora sono curioso/cauto. In genere mi aspetto che sizeof restituisca il numero di byte, ma qui decomprime e conteggia gli argomenti per me. Con un array, la dimensione tipica mi darà la dimensione in byte dell'array. Ci sono "trucchi" che le persone devono prestare attenzione all'utilizzo di sizeof ...? Non sono abbastanza esperto w/C++ da vedere a questo punto, ma c'è solo qualcosa di molto diverso da me sull'utilizzo di sizeof per contare le cose invece di ottenere le loro dimensioni reali in byte. Sono semanticamente paranoico? lol. –

+0

@pheadbaq: puoi usare 'sizeof ...' su un pacchetto di parametri e restituisce sempre il numero di argomenti nel pacchetto. Non penso che ci sia molto spazio per errori nel suo utilizzo, ma capisco cosa intendi. Personalmente, penso che 'sizeof ... 'sia un ridicolo abuso della parola chiave' sizeof', ma, non scrivo la lingua, la uso solo. :-) –

+8

Nota la differenza di 'sizeof ... (Types)' e 'sizeof (Types) ...'. Quest'ultimo sta contando i byte, il primo sta contando i tipi :) –

3

Ecco a link che può aiutarti. Esempio di origine del collegamento:

template<typename... Args> struct count; 

template<> 
struct count<> { 
    static const int value = 0; 
}; 

template<typename T, typename... Args> 
struct count<T, Args...> { 
    static const int value = 1 + count<Args...>::value; 
}; 
+0

Link non funziona più, perché aggiungi 1 al conteggio? –

Problemi correlati