Was kosten Templates?
-
x schrieb:
ahja, das lässt sich nicht hartcodieren, oder was
Tu bitte mal
template <typename ForwardIterator> void Algorithm(ForwardIterator itr) { typedef typename std::iterator_traits<ForwardIterator>::value_type ValueType; ... // Mache was mit ValueType }
hier
ValueType
ohne Metaprogrammierung hardcodieren.
-
Shade Of Mine schrieb:
ipsec schrieb:
Aber sämtliche Beispiele dafür sind prinzipbedingt akademischer Humbug, denn ein zur Compilezeit feststehendes Ergebnis kann ich genauso gut hardcodieren.
Es sei denn das Ergebnis ist nicht eine Zahl sondern ein Typ.
Dann wirds naemlich interessant.Ja natürlich, da habe ich mich falsch ausgedrückt. Ich meinte Beispiele wie:
fak<10>::value; primzahlen_bis<100>::value; nullstelle<add<mul<2, mul<x, x> >, -1> >::next::value; // 2. Nullstelle von f(x)=2x^2-1 kuerzester_weg<'A', 'C', graph<knoten<'A'>, knoten<'B'>, knoten<'C'>, kante<'A', 'B', 1>, kante<'B', 'C', 2>, kante<'A', 'C', 100> > >::begin::next; // 2. Knoten des kürzesten Weges // von A nach C in dem Graphen
Diese Ergebnisse kann man wesentlich lesbarer auch hardcodieren.
Das in Verbindung mit Typen TMP gewaltig Entwicklungszeit oder Laufzeit spart, ist natürlich klar. (Man denke an eine Implementierung von vector ohne Templates (und am besten noch ohne Makros, denn die sind böse)).
-
ipsec schrieb:
und am besten noch ohne Makros, denn die sind böse
Interessant ist doch gerade, dass Makros in Kombination mit Template-Metaprogrammierung enormes Potential haben.
Ob nun
TYPELIST_4(int, double, bool, signed char)
oder
STATIC_ASSERT(Condition)
oder
MAP_TYPES(KeyA, ValueA) MAP_TYPES(KeyB, ValueB) MAP_TYPES(KeyC, ValueC)
Man hat mit Makros eine effiziente Waffe gegen den unschönen und sperrigen Template-Code. Man kann Metafunktionen wie Funktionen aussehen lassen. Makros ermöglichen sogar mächtige Codegeneratoren wie Boost.Preprocessor.