613 Stimmen

Verwenden Sie 'class' oder 'typename' für Vorlagenparameter?

Mögliches Duplikat:
C++ Unterschied der Schlüsselwörter 'typename' und 'class' in Vorlagen

Wenn man eine Funktions- oder Klassenvorlage in C++ definiert, kann man das so schreiben:

template <class T> ...

oder man kann dies schreiben:

template <typename T> ...

Gibt es einen guten Grund, das eine dem anderen vorzuziehen?


Ich habe die populärste (und interessanteste) Antwort akzeptiert, aber die wirkliche Antwort scheint zu lauten: "Nein, es gibt keinen guten Grund, das eine dem anderen vorzuziehen."

  • Sie sind gleichwertig (außer wie unten angegeben).
  • Manche Menschen haben Gründe, immer die typename .
  • Manche Menschen haben Gründe, immer die class .
  • Manche Menschen haben Gründe, beides zu verwenden.
  • Manchen Leuten ist es egal, welche sie benutzen.

Beachten Sie jedoch, dass vor C++17 im Falle von Vorlage Vorlage Parameter, Verwendung von class 代わりに typename erforderlich war. Siehe Antwort von user1428839 unten. (Aber in diesem speziellen Fall geht es nicht um eine Präferenz, sondern um eine sprachliche Vorgabe).

10voto

Aaron Punkte 3397

Als Antwort auf Mike B. Ich ziehe es vor, "class" zu verwenden, da "typename" innerhalb einer Vorlage eine überladene Bedeutung hat, "class" aber nicht. Nehmen Sie dieses Beispiel eines geprüften Integer-Typs:

template <class IntegerType>
class smart_integer {
public: 
    typedef integer_traits<Integer> traits;
    IntegerType operator+=(IntegerType value){
        typedef typename traits::larger_integer_t larger_t;
        larger_t interm = larger_t(myValue) + larger_t(value); 
        if(interm > traits::max() || interm < traits::min())
            throw overflow();
        myValue = IntegerType(interm);
    }
}

larger_integer_t ist ein abhängiger Name und erfordert daher, dass ihm 'typename' vorangestellt wird, damit der Parser erkennen kann, dass larger_integer_t ist ein Typ. Klasse hat hingegen keine solche überladene Bedeutung.

Das... oder ich bin einfach nur faul im Herzen. Ich tippe 'class' viel öfter als 'typename' und finde es daher viel einfacher zu tippen. Oder es könnte ein Zeichen dafür sein, dass ich zu viel OO-Code schreibe.

10voto

Einfach Geschichte pur. Zitat von Stan Lippman :

Der Grund für die beiden Schlüsselwörter ist historisch bedingt. In der ursprünglichen Vorlagenspezifikation verwendete Stroustrup das vorhandene Schlüsselwort class zur Angabe eines Typparameters, anstatt ein neues Schlüsselwort einzuführen, das natürlich bestehende Programme zerstören könnte. Es war nicht so, dass ein neues Schlüsselwort nicht in Betracht gezogen wurde - es wurde nur nicht als notwendig erachtet, da es potenziell störend wäre. Und bis zum ISO-C++-Standard war dies die einzige Möglichkeit, einen Typparameter zu deklarieren.

Aber man sollte die typename statt Klasse ! Siehe den Link für weitere Informationen, aber denken Sie an den folgenden Code:

template <class T>
class Demonstration { 
public:
void method() {
   T::A *aObj; // oops ...
};

8voto

Es spielt überhaupt keine Rolle, aber die Klasse lässt es so aussehen, als ob T nur eine Klasse sein kann, während es natürlich jeder Typ sein kann. Also ist typename genauer. Andererseits verwenden die meisten Leute class, so dass es im Allgemeinen wahrscheinlich einfacher zu lesen ist.

1voto

Grant Limberg Punkte 20123

Soweit ich weiß, spielt es keine Rolle, welche Sie verwenden. In den Augen des Compilers sind sie gleichwertig. Verwenden Sie, was immer Sie bevorzugen. Ich verwende normalerweise class.

-6voto

muenalan Punkte 500

Ich erweitere den Kommentar von DarenW.

Sobald typename und class nicht mehr als sehr unterschiedlich angesehen werden, kann es immer noch sinnvoll sein, ihre Verwendung streng zu regeln. Verwenden Sie class nur, wenn es sich wirklich um eine Klasse handelt, und typename, wenn es sich um einen Basistyp handelt, wie z. B. char .

Diese Typen werden nämlich auch anstelle von typename

Vorlage< char myc \= '/' >

was in diesem Fall sogar besser wäre als typename oder class.

Denken Sie an die "Anzüglichkeit" oder die Verständlichkeit für andere Menschen. Und bedenken Sie, dass Software/Skripte von Drittanbietern versuchen könnten, den Code/die Informationen zu nutzen, um zu erraten, was mit der Vorlage geschieht (siehe Swig).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X