sovraccarico di costexpr
-
30-10-2019 - |
Domanda
Imparentato: Funzione di ritorno costexpr non si compila
Sento che Contexpr è limitato nell'utilità in C ++ 11 a causa dell'incapacità di definire due funzioni che altrimenti avrebbero la stessa firma, ma che ne sono una costexpr e l'altra non Contexpr. In altre parole, sarebbe molto utile se potessi, ad esempio, un costruttore di costexpr std :: string che prende solo argomenti di costexpr e un costruttore String non-ConstExpr STD :: String per argomenti non-non-non-Contexpr. Un altro esempio sarebbe una funzione teoricamente complicata che potrebbe essere resa più efficiente usando lo stato. Non è possibile farlo facilmente con una funzione costexpr, quindi sei lasciato con due scelte: avere una funzione costexpr che è molto lenta se si passa in argomenti non con non-non-non-non-non-non-non-non-non-non- ma potresti non sapere quale versione chiamare).
La mia domanda, quindi, è questa:
È possibile per un'implementazione C ++ 11 conforme standard per consentire il sovraccarico di funzioni in base agli argomenti che sono costexpr o ciò richiederebbe l'aggiornamento dello standard? Se non è consentito, non era intenzionalmente consentito?
@Nicolbolas: dì che ho una funzione che mappa un enum
a a std::string
. Il modo più diretto per farlo, supponendo il mio enum
va da 0
a n - 1
, è creare una matrice di dimensioni n
riempito con il risultato.
Potrei creare un static constexpr char const * []
e costruisci a std::string
al ritorno (pagando il costo della creazione di un std::string
oggetto ogni volta che chiamo la funzione), oppure posso creare un static std::string const []
e restituire il valore che cerco, pagando il costo di tutto il std::string
costruttori la prima volta che chiamo la funzione. Sembra che una soluzione migliore sarebbe quella di creare il std::string
in memoria al momento della compilazione (simile a quello che viene fatto ora con char const *
), ma l'unico modo per farlo sarebbe quello di avvisare il costruttore che ha constexpr
argomenti.
Per un esempio diverso da a std::string
costruttore, penso che sia piuttosto diretto trovare un esempio in cui, se si potesse ignorare i requisiti di constexpr
(e quindi crea un nonconstexpr
funzione), è possibile creare una funzione più efficiente. Considera questo thread: Domanda di Contexpr, perché questi due diversi programmi eseguono in una quantità così diversa di tempo con G ++?
Se chiamo fib
con un constexpr
Argomento, non posso battere meglio del compilatore che ottimizza completamente la chiamata della funzione. Ma se chiamo fib
con un nonconstexpr
argomento, potrei voler chiamarla la mia versione che implementa cose come la memorizzazione (che richiederebbe lo stato), quindi ho tempo di esecuzione simile a quello che sarebbe stato il mio tempo di compilazione se avessi superato un constexpr
discussione.
Nessuna soluzione corretta