2016-05-29 4 views
2

Leider kann man nicht so etwas tun:constexpr typedef

typedef constexpr int cint; 

Und das ist nicht das Ende der Welt .... müssen nur die zusätzlichen 9 tippen (10 wenn Sie den Raum einschließen) Zeichen jedes Mal, wenn Sie constexpr verwenden müssen.

Aber ich habe eine Klasse erstellt, und ich möchte nur der Lage sein, constexpr Versionen dieser Klasse zu erstellen (eine nicht constexpr Version verwenden würde keinen Sinn machen).

So war mein Plan, um die Klasse mit einem nicht zugänglich Namespace zu erstellen, und dann in meinem Haupt-Namensraum ein constexpr typedef erstellen, etwa so:

namespace MainNameSpace{ 
    namespace detail{ 
    class MyClass{}; 

    } 
    typedef constexpr detail::MyClass MyClass; 
} 

Leider entdeckte ich, dass dies nicht getan werden kann ... Gibt es eine Möglichkeit, einen ähnlichen Effekt zu erzielen (ohne Verwendung von Makros)?

+5

'conexpr' ist nicht Teil des Typsystems. Es ist Teil des Systems * expression *, d. H. Der Natur von * Werten *. –

+0

@KerrekSB Ich entdeckte, dass der harte Weg – DarthRubik

+1

'mit einer non consExpr-Version keinen Sinn machen würde 'Wie macht eine constexpr-Version Sinn? Was erwartest du von ihm? – deviantfan

Antwort

0

typedef constexpr detail::MyClass MyClass; macht nicht viel Sinn. Sie erstellen einen Vertrag, MyClass ist eine gültige constexpr Klasse und Sie werden es nur in constexpr Kontexten verwenden, aber es gibt keine Möglichkeit der Compiler kann garantieren, dass durch diese Anweisung allein ... es kommt alles darauf an, wie MyClass implementiert ist und in welchen Kontexten du es verwendest. Es ist überflüssig und bedeutungslos. Wenn Sie an einer "Kompilierzeit-String-Klasse" interessiert sind, werfen Sie einen Blick auf string_view.