/ / C ++ Come verificare il tipo di una mappa variante al momento della compilazione - c ++, meta-programmazione template, variante

C ++ Come verificare il tipo di una variante di mappa in fase di compilazione - c ++, template-meta-programming, variant

Vorrei avere una mappa di coppie chiave, valore; le chiavi possono essere implementate come string o enum class; ma i valori devono supportare più tipi, ad es. int o bool

Ora, vorrei avere una funzione con la seguente firma

template<typename T>
void getOption(KeyClass key_, T& value_)

Dato che la mappa sarà costante, è possibile effettuare la funzione controllando il tipo in fase di compilazione?

Ad esempio, se la mappa è simile a {"start_time": 2, "can_abort": false}

Dovrebbe esserci un errore di compilazione attivo

bool can_abort;
getOption("start_time", can_abort);

risposte:

0 per risposta № 1

Se puoi usare i valori enum per le tue chiavi e i tipi e i valori sono noti in fase di compilazione, perché non avere una semplice struttura?

struct options_t {
int start_time;
bool can_abort;
};

Se devi davvero scorrere elementi di tipi diversi, puoi andare in voodoo completo e utilizzare la libreria Boost.Hana di Louis Dionne. Ha un classe di mappe multi-tipo. Tutto sarà controllato al momento della compilazione.

In alternativa, se si desidera un comportamento più orientato al tempo di esecuzione e si desidera flessibilità w.r.t. i tipi che rimani nella tua mappa, puoi usare la cancellazione dei tipi e renderlo, diciamo, un std::unordered_map<std::string, std::any>. Il std::any il tipo contiene, beh, un valore di qualsiasi tipo; ma spetta a te sapere quale tipo provare a estrarre da esso (se sbagli ottieni un'eccezione), ovvero non avrai il controllo del tempo di compilazione.

Per quanto riguarda l'utilizzo di una variante, puoi usarli, ma se le tue chiavi lo sono std::strings, quindi nulla verrà verificato al momento della compilazione, come std::strings comportano l'allocazione dell'heap.