Erstellen Sie einen Alias ​​für ein numerisches Array

8

Ich möchte einen Alias ​​von std::array nur mit numerischen Typen erstellen

%Vor%

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?

    
michal915 16.09.2016, 07:29
quelle

2 Antworten

10

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%     
HolyBlackCat 16.09.2016 07:33
quelle
6

(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

verwenden

In c ++ 14 haben Sie auch einige Möglichkeiten.

Ich bevorzuge:

%Vor%

@holyblackcat hat Ihnen einen anderen Weg in seine Antwort

    
bolov 16.09.2016 07:48
quelle

Tags und Links