2012-08-11 11 views
5

To jest wersja uproszczona, co chciałbym zrobić.Jak mogę mieć zmienną tymczasową w funkcji constexpr?

constexpr float f(float a, float b){ 
    constexpr float temp = a+b; 
    return temp*temp*temp; 
} 

W mojej wersji, a + b jest czymś znacznie bardziej skomplikowanym, więc nie chcę go trzykrotnie wycinać i wklejać. Użycie 3 * (a + b) nie jest również rozwiązaniem roboczym dla prawdziwej funkcji. Próbuję zachować pytanie dotyczące składni, a nie algebry. Mogę go uruchomić, przenosząc a + b do swojej własnej funkcji constexpr, ale wolałbym nie zanieczyszczać przestrzeni nazw za pomocą bezużytecznych funkcji.

+4

Jest to najbardziej podniosła rzecz na temat firmy constexpr. –

Odpowiedz

3

Jest to niedozwolone w C++ 11, ale jest teraz dozwolone w C++ 14.

Zobacz https://en.wikipedia.org/wiki/C%2B%2B14#Relaxed_constexpr_restrictions

+2

Powinieneś zrobić to na odwrót. 'f2 (float temp) {temp. powr. * temp * temp; } 'i' f (float a, float b) {return f2 (a + b); } '. W ten sposób unikniesz 3 połączeń. –

+0

To nie ma znaczenia ze względu na constexpr, ponieważ wskazuje kompilatorowi, że wyniki funkcji mogą być zapamiętane i/lub ocenione w czasie kompilacji. Kompilator wywoła temp raz i ponownie użyje tej wartości 3 razy. Suma całkowita 1 dodać, 3 mnożyć na swój sposób i na mój sposób. Ale, jak powiedziałem w intro, uprościłem problem, ponieważ pytanie nie dotyczy algebry. –

+2

@JohnK: Nie ma znaczenia dla skompilowanego kodu, ale * ma * znaczenie dla ludzi piszących i czytających ten kod. Dla tego, który je pisze: Mniej powtórzeń = mniejsze możliwości popełnienia błędu. Dla kogoś, kto to czyta: Łatwiej jest zorientować się, że masz trzy razy taką samą wartość. – celtschk

6

Jak odkryłem, nie można deklarować zmienne, nawet constexpr te, wewnątrz ciała funkcji constexpr.

Wciąż można wyodrębnić wspólne wyrażenie, przekazując je jako argument do drugiej funkcji constexpr. Na przykład podany tutaj:

constexpr float pow3(float c) { 
    return c*c*c; 
} 

constexpr float f(float a, float b) { 
    return pow3(a+b); 
} 
Powiązane problemy