Ich möchte einen Alias von std::array
nur mit numerischen Typen erstellen
Dies funktioniert korrekt mit einer Ganzzahl
%Vor%Aber wenn ich ein float oder double möchte, habe ich einen Fehler wegen des nicht-type Template-Parameters
%Vor%Es gibt eine andere Möglichkeit, dies zu tun?
Wenn Sie verhindern möchten, dass jemand dieses Alias mit nicht-arithmetischen Typen verwendet, haben Sie es falsch gemacht.
Ihr Code wird jeden Typ zulassen, der ein gültiges Template-Argument ist und aus bool
erstellt werden kann und das ist alles.
Die richtige Lösung wäre etwa so:
%Vor%Warum Ihr Code nicht funktioniert:
Sehen Sie sich diesen Teil an:
%Vor%Er erstellt ein unbenanntes Template-Argument vom Typ T und legt einen Standardwert für dieses Template fest.
Auch wenn std::is_arithmetic<T>::value
falsch ist, wird der Code kompiliert, solange T
aus bool
erstellt werden kann.
Natürlich muss T
auch als Template-Argument verwendet werden können. (Deshalb funktioniert float
nicht. Fließkommatypen können keine Vorlagenargumente sein. Siehe hierzu: Warum kann ich float value nicht als Template-Parameter verwenden? )
Auch hier gibt es keinen Grund, dass der Compiler Fehler erzeugt, wenn std::is_arithmetic<T>::value
falsch ist.
Zum Beispiel erlaubt Ihr Code folgenden Typ:
%Vor%(Hoffentlich) Sehr bald werden wir es sehr sauber mit Konzepten schreiben können:
%Vor% Und übrigens, dies kompiliert und führt jetzt auf gcc 7 mit -fconcepts
aus. Für gcc 6 müssen Sie std::is_arithmetic<T>::value
In c ++ 14 haben Sie auch einige Möglichkeiten.
Ich bevorzuge:
%Vor%@holyblackcat hat Ihnen einen anderen Weg in seine Antwort