19 Stimmen

Warum ist std::less ein Klassenvorlage?

Gemäß 20.8.5 §1 ist std::less eine Klassenvorlage mit einer Memberfunktion:

template
struct less
{
    bool operator()(const T& x, const T& y) const;
    // ...
};

Dies bedeutet, dass ich den Typ angeben muss, wenn ich die Vorlage instanziiere, zum Beispiel std::less. Warum ist std::less nicht einfach eine normale Klasse mit einer Memberfunktionenvorlage?

struct less
{
    template
    bool operator()(const T& x, const U& y) const;
    // ...
};

Dann könnte ich einfach std::less an einen Algorithmus übergeben, ohne das Typargument angeben zu müssen, was kompliziert werden kann.

Ist das nur aus historischen Gründen so, weil frühe Compiler angeblich Memberfunktionsvorlagen nicht sehr gut (oder möglicherweise überhaupt nicht) unterstützten, oder steckt etwas Tiefergehendes dahinter?

28voto

Charles Salvia Punkte 50361

Es ist so, dass die von der instanziierten Vorlage erstellte Klasse geschachtelte typedefs hat, die Typinformationen über den Ergebnistyp und die Argumenttypen des Funktors bereitstellen:

  template 
  struct binary_function 
  {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
  };

  template  
  struct less : binary_function  
  {
    bool operator() (const T& x, const T& y) const;
  };

std::less erbt von std::binary_function, das diese typedefs erzeugt. So können Sie beispielsweise den Ergebnistyp mit std::less::result_type extrahieren.

Heutzutage ist dies größtenteils mit den Schlüsselwörtern decltype und auto von C++11 unnötig.

9voto

Pete Becker Punkte 74051

So haben wir es damals in C++98 gemacht. Jetzt, da wir Vorlagen und Vorwärtsverweise besser verstehen (mit 14 Jahren mehr Erfahrung), tun neuere Funktionstypen das, was du gesagt hast: Der Funktionsaufrufoperator ist eine Vorlagenfunktion.

1voto

Puppy Punkte 141483

Meines Verständnisses nach wurde der Vorschlag von Stephan, dies so zu ändern, dass alle solchen Funktionsobjekte in ihrem operator() polymorph sind, bei der letzten Sitzung akzeptiert.

Also die Antwort auf deine Frage "Warum ist der Funktionsaufrufoperator nicht vorlagenbasiert?", ist dass er es ist.

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