2013-04-29 22 views
50

C'è una differenza tra la dichiarazione della costante in virgola mobile come variabile static constexpr e una funzione come nell'esempio di seguito, o è solo una questione di stile?statico constexpr variabile vs funzione

class MY_PI 
{ 
public: 
    static constexpr float MY_PI_VAR = 3.14f; 
    static constexpr float MY_PI_FUN() { return 3.14f; } 
} 

risposta

51

constexpr funzioni

funzioni hanno un vantaggio che variabili libere non hanno (fino C++ 14 che è): possono essere facilmente basati su modelli senza qualche classe boilerplate. Ciò significa che si può avere la vostra pi con una precisione in funzione di un argomento di un template:

template<typename T> 
constexpr T pi(); 

template<> 
constexpr float pi() { return 3.14f; } 

template<> 
constexpr double pi() { return 3.1415; } 

int main() 
{ 
    constexpr float a = pi<float>(); 
    constexpr double b = pi<double>(); 
} 

Tuttavia, se si decide di utilizzare una funzione static membro invece di una funzione libera, non sarà più breve né easir di scrivere di una variabile membro static.

constexpr variabili

Il principale vantaggio di utilizzare una variabile è che ... bene. Vuoi una costante, giusto? E 'chiarisce l'intento e questo potrebbe essere uno dei punti più importanti qui.

si potrebbe ancora avere un comportamento equivalente con una classe, ma poi, si dovrà usare in questo modo se la classe è una classe che contiene varie costanti matematiche:

constexpr float a = constants<float>::pi; 

o come questo se la classe il solo scopo di rappresentare pi:

constexpr double = pi<double>::value; 

Nel primo caso, si può scegliere di utilizzare le variabili in quanto sarà più breve di scrivere e che sarà davvero dimostrare che si sta utilizzando una costante e non cercando di calcolare qualcosa. Se hai solo una classe che rappresenta il pi, potresti comunque utilizzare una funzione gratuita constexpr anziché un'intera classe. Sarebbe IMHO essere più semplice.

C++ 14: constexpr variable templates

Tuttavia, si noti che se si sceglie di utilizzare C++ 14 invece di C++ 11, si sarà in grado di scrivere il seguente tipo di constexpr modelli variabili:

template<typename T> 
constexpr T pi = T(3.1415); 

che vi permetterà di scrivere il codice in questo modo:

constexpr float a = pi<float>; 

In C++ 14, questo può essere il modo migliore per fare le cose. Se si utilizza una versione precedente dello standard, i primi due paragrafi sono ancora validi.

+0

C++ 14? Cos'è quello? : D – cubuspl42

+4

@ cubuspl42 Il prossimo standard C++ che dovrebbe essere disponibile l'anno prossimo. GCC e Clang hanno già iniziato a implementare alcune delle funzionalità. – Morwenn

+0

Potete fornire un collegamento? – cubuspl42

Problemi correlati