17 Stimmen

Wann/Warum (wenn überhaupt) sollte ich über generische Programmierung/Meta-Programmierung nachdenken?

IMHO sind für mich OOPS, Design Patterns sinnvoll und ich habe sie praktisch anwenden können.

Aber wenn es darum geht "Generische Programmierung/Metaprogrammierung" der Art Modern C++, bin ich verwirrt.

-- Ist es ein neues Programmier-/Entwurfsparadigma?

-- Ist sie nur auf die "Bibliotheksentwicklung" beschränkt? Wenn nicht, welche Design-/Codierungssituationen erfordern die Verwendung von Metaprogrammierung/generischer Programmierung.

-- Bedeutet die Verwendung von Vorlagen, dass ich generisch programmiere?

Ich habe viel zu diesem Thema gegoogelt, aber ich verstehe das GROSSE BILD nicht ganz. Siehe auch dies Beitrag .


Nach der Lektüre der Diskussionen hier unter, bis jetzt, bin ich sicher (kann immer noch nicht richtig sein):

a) Generische Programmierung und Metaprogrammierung sind zwei unterschiedliche Konzepte.

3voto

Tobias Punkte 6110

Wann:

Die Schablonen-Meta-Programmierung ist eine Methode zum Schreiben von Programmen, die vom Compiler interpretiert werden. Sie ist eine Abstraktionsebene höher. Man kann damit alle möglichen verrückten Dinge anstellen. Die Boost-Bibliotheken enthalten viele Beispiele:

  • Sie mögen es nicht, dass C++ statisch typisiert ist? Verwenden Sie boost::any.
  • Ich liebe Lambda Calculus, aber müssen Sie C++? Verwenden Sie boost:lambda.
  • Sie haben eine EBNF und brauchen einen Parser? Verwenden Sie boost::spirit.

Warum?

Das ist cool. Du kannst deine Dates beeindrucken (vielleicht).

1voto

TimW Punkte 8157

Wenn Sie noch etwas Zeit haben und zu spielen .

Wenn Sie Ihren Algorithmus verstärken müssen und keinen Overhead durch virtuelle Funktionsaufrufe wünschen, können Sie die Laufzeitbindung durch Kompilierzeitbindungen ersetzen.

0 Stimmen

Ich sehe mir das Video jetzt an. Danke

0 Stimmen

Viel Spaß, mir gefällt der Teil, in dem Scott Meyers zugibt, dass er ziemlich lange gebraucht hat, um die Liste zusammenzustellen.

1voto

Nick Dandoulakis Punkte 41402

Einfaches Beispiel:

template<typename T>
void
swap(T& var1, T& var2)
{
  T var3 = var1;
  var1 = var2;
  var2 = var3;
}

int a = 2;
int b = 3;
swap(a, b);

float c = 400.0f;
float d = 500.0f;
swap(c, d);

die Werte von 2 Variablen desselben Typs vertauschen.

Mit Templates vermeiden wir es, explizit Funktionen für verschiedene Typen zu erstellen Kombinationen wie diese:

void
swap(int& var1, int& var2)
{
  int var3 = var1;
  var1 = var2;
  var2 = var3;
}

void
swap(float& var1, float& var2)
{
  float var3 = var1;
  var1 = var2;
  var2 = var3;
}

Die oben genannten Funktionen werden automatisch vom Compiler erstellt, in meinem Beispiel, wenn swap() irgendwo im Code mit int ou Schwimmer , Variablen.

3 Stimmen

Das ist nur die grundlegende Verwendung von Vorlagen. Ich würde es nicht als Metaprogrammierung bezeichnen.

2 Stimmen

Einfach, ja, aber dennoch ist es Metaprogrammierung. Die Argumente können auch Vorlagentypen sein.

2 Stimmen

Das ist meiner Meinung nach ein gutes Argument. Die Metaprogrammierung ist nicht völlig von der "normalen" Programmierung getrennt. Technisch gesehen, dieses Beispiel ist Metaprogrammierung. Es ist einfach so einfach und wird so häufig verwendet, dass wir es normalerweise nicht als solches betrachten. Aber es ist ein guter Punkt, dass Metaprogrammierung nicht haben zu einer obskuren Guru-Sache, die nur dazu dient, Ihre C++-Kenntnisse zu zeigen und andere davon abzuhalten, Ihren Code zu lesen.

0voto

Konstantin Tenzin Punkte 11704

Ich denke, wenn Sie kein Bibliotheksentwickler sind, dann ist es besser, die Metaprogrammierung von Vorlagen zu vergessen. Ich glaube, dass sie im Produktionscode nutzlos ist und mehr Probleme als Vorteile bringt: "Wenn man einmal angefangen hat, sie zu benutzen, verliert man die Flexibilität, weil man an diese Lösung gebunden ist. Es ist sehr schwer, von schablonengekochtem Code wegzukommen, wenn man einmal angefangen hat, ihn zu benutzen. Und das ist ein Problem, denn Templates sind nicht flexibel genug".

P.S. Ich meine natürlich nicht Template-Container, Swaps, ... sondern Alexandrescu-artigen Code

0 Stimmen

Vielen Dank für die Antwort. Nach meinem geringen Wissen und Googeln stimme ich Ihnen zu. Ich hoffe, dass jemand anderer Meinung ist und Gegenargumente liefert.

0 Stimmen

Ich wage zu behaupten, dass ich anderer Meinung bin. Mein Produktionscode verwendet Metaprogrammierung, wo es angebracht ist: mit Typ-Selektoren, explizite Instanziierung usw...

0 Stimmen

Ich verstehe nicht, was Sie meinen. Inwiefern verlieren Sie an Flexibilität, und inwiefern ist es schwer, von vorlagenlastigem Code wegzukommen? Ich glaube, ich bin da anderer Meinung, aber eher im Sinne von "Ich kann mir kein einziges Beispiel vorstellen, auf das das zutrifft". Können Sie das ein wenig näher erläutern?

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