2015-02-23 16 views
14

Czy istnieje sposób na uzyskanie innego zachowania funkcji constexpr w fazie kompilacji iw czasie wykonywania?Określić wykonanie `constexpr` - podczas kompilacji lub w czasie wykonywania?

Rozważmy następujący przykład (przy użyciu funkcji teoretycznej z D: static if):

constexpr int pow(int base , int exp) noexcept 
{ 
    static if(std::evaluated_during_translation()) { 
     auto result = 1; 
     for(int i = 0 ; i < exp ; i++) 
      result *= base; 
     return result; 
    } else { // std::evaluated_during_runtime() 
     return std::pow(base , exp); 
    } 
} 

Jeśli nie, to czy jest jakiś sposób, aby ograniczyć constexpr być tylko w czasie kompilacji?

+2

Jeśli użyjesz go w [tekście, w którym wymagane jest stałe wyrażenie, to powinno być ocenione w czasie kompilacji] (http://stackoverflow.com/a/25891133/1708801) –

+0

Możesz mieć szczęście z wewnętrznym GCC '__builtin_constant_p' ... – Deduplicator

+0

@Deduplicator nie jest dobrze udokumentowaną funkcją, przynajmniej ostatnio wyglądałem, ale umieściłem na niej wszystko, co mogłem znaleźć w mojej [answer here] (http://stackoverflow.com/a/24400015/ 1708801). –

Odpowiedz

6

Nie, nie ma takiego sposobu.

Przepraszamy.

N3583 is a paper proponuje zmiany, aby umożliwić to, o co prosisz.

+0

Widziałem to [rozmowa Scotta Meyersa] (https://www.youtube.com/watch?v=WDIkqP4JbkE), w którym mówi również, że trzeba użyć dwóch różnych funkcji. – nonsensation

+0

Ten artykuł jest dobrą odpowiedzią, niestety musimy poczekać kilka lat, aż (jeśli w ogóle) zostanie zaimplementowany. Cecha typu byłaby łatwa do wdrożenia dla twórców kompilacji i miałaby minimalny wpływ na standard. – nonsensation

+0

Czy znasz status tej propozycji? – nonsensation

Powiązane problemy