2015-02-23 4 views
14

Gibt es eine Möglichkeit, ein unterschiedliches Verhalten einer constexpr Funktion in der Kompilierungsphase und zur Laufzeit zu erreichen?"conetexpr" -Ausführung bestimmen - während der Kompilierung oder zur Laufzeit?

Betrachten Sie das folgende Beispiel (eine theoretische Funktion von D: static if verwenden):

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); 
    } 
} 

Wenn nicht, gibt es eine Möglichkeit, constexpr beschränken sich nur auf sein kompilieren Zeit?

+2

Wenn Sie es in einem [conext verwenden, wo ein konstanter Ausdruck erforderlich ist, sollte es zur Kompilierzeit ausgewertet werden] (http://stackoverflow.com/a/25891133/1708801) –

+0

Sie könnten Glück mit GCC-intrinsic haben '__builtin_constant_p' ... – Deduplicator

+0

@Deduplicator nicht eine sehr gut dokumentierte Funktion, zumindest das letzte Mal, als ich schaute, aber ich legte alles, was ich finden konnte darauf in meinem [Antwort hier] (http://stackoverflow.com/a/24400015/ 1708801). –

Antwort

6

Nein, es gibt keinen solchen Weg.

Entschuldigung.

N3583 is a paper Änderungen vorschlagen, um zu erlauben, was Sie verlangen.

+0

Ich habe das gerade gesehen [Scott Meyers Talk] (https://www.youtube.com/watch?v=WDIkqP4JbkE), wo er auch sagt, dass man zwei verschiedene Funktionen benutzen muss. – nonsensation

+0

Dieses Papier ist eine gute Antwort, leider müssen wir ein paar Jahre warten, bis (wenn überhaupt) es umgesetzt wird. Ein Typmerkmal wäre für Compiler-Schreiber einfach zu implementieren und hätte nur minimale Auswirkungen auf den Standard. – nonsensation

+0

Kennen Sie den Status dieses Vorschlags? – nonsensation