2012-02-29 10 views
9

Jak rozumiem, constexpr nie jest kompletnym Turingiem w przeciwieństwie do metaprogramowania szablonu, więc uważam, że to nie to samo. Tak więc pytanie brzmi, w jakim stopniu constexpr powoduje, że metaprogramowanie szablonów staje się przestarzałe?C++ 11 constexpr do przestarzałych meta-programowania szablonów?

+1

'constexpr' jest Turing complete (oczywiście ignorując wymagania nieskończoności). –

+0

@ R.MartinhoFernandes: Jeśli 'constexpr' jest Turing kompletny, użyj tylko' constexpr' do modelowania listy liczb całkowitych dopuszczalnych na obu końcach. – kennytm

+0

@ R.MartinhoFernandes: Możesz być ciekawy w zamieszczaniu odpowiedzi na http://stackoverflow.com/questions/9201506/is-constexpr-based-computation-turing-complete. – kennytm

Odpowiedz

21

constexpr jest absolutnie Turing-complete. Rekursja jest dozwolona. Jest to wygodny sposób definiowania funkcji działających w czasie kompilacji oraz w czasie wykonywania. Funkcje constexpr, będąc jedynie funkcjami, nie mogą wykonywać operacji na typach. (O ile nie używasz metaprogramowania szablonu do zdefiniowania tej funkcji, oczywiście.)

Oba szablony klas i constexpr mogą być używane do przechowywania wyrażeń stałych w czasie kompilacji, ale tam kończy się podobieństwo. Nie są one zbędne, a TMP w najbliższym czasie nie zniknie.

Niektóre szczególnie brzydkie obliczenia kompilacji mogą być bardziej elegancko przepisane jako odpowiednie funkcje.

+5

+1 dla obserwacji, że 'constexpr' nie może działać na typach. –

+0

Dzięki za wyjaśnienie tego tak dobrze ... – polapts