Sfortunatamente, non è possibile garantire che una funzione constexpr
, anche la più banale, venga valutata dal compilatore a meno che non sia assolutamente necessario. Cioè, a meno che non appaia in un punto in cui il suo valore è richiesto al momento della compilazione, ad es. in un modello. Per far valere il compilatore a fare la valutazione durante la compilazione, è possibile effettuare le seguenti operazioni:
constexpr int foo_implementation (int x) {
return x + 1;
}
#define foo(x) std::integral_constant<int, foo_implementation(x)>::value
e quindi utilizzare foo
nel codice come al solito
int f = foo(123);
La cosa bella di questo approccio è che garantisce compilazione tempo di valutazione, e si otterrà un errore di compilazione se si passa una variabile run-time per foo
:
int a = 2;
int f = foo(a); /* Error: invalid template argument for 'std::integral_constant',
expected compile-time constant expression */
Il non così la cosa bella è che richiede una macro, ma questo sembra al momento inevitabile se si vuole sia una valutazione garantita in fase di compilazione sia un bel codice. (! Mi piacerebbe essere smentiti però)
fonte
2015-09-24 12:16:40
si può sempre trasformare in un modello di funzione: 'template int foo() {return x + 1; } ' –
Si noti che' constexpr' è stato parzialmente chiamato in essere per neutralizzare tutti i workaround sintattici che si vedranno nelle risposte qui. – rubenvb
'#define foo (N) pippo()' mi sembra praticabile. –