Wie kann die auto Schlüsselwortfunktionalität ohne Verwendung des C ++ 0x-Standards realisiert werden?
%Vor%Vielleicht solche Klasse:
%Vor%Bei einer solchen Verwendung:
%Vor%Aber T1 und T2 sind anders. Wie verschiebe ich Informationen über T1 nach operator T2 () ? Ist das wirklich möglich?
Wenn eine Bibliothekserweiterung einfach implementiert werden konnte, war keine Spracherweiterung erforderlich. Einzelheiten zum automatischen Vorschlag finden Sie N1607 .
>Der Artikel auf der Boost.Foreach (welche Art von tut was Sie wollen) Makro kann helfen, die Probleme im Zusammenhang mit einer solchen Implementierung zu verstehen.
Was ist BOOST_FOREACH?
In C ++ schreibt man eine Schleife, die iteriert über eine Sequenz ist langweilig. Wir können Verwenden Sie entweder Iteratoren, die a erfordern beträchtliche Menge an Kesselplatte, oder wir können die std :: for_each () benutzen Algorithmus und verschiebe unseren Schleifenkörper in ein Prädikat, das nicht weniger erfordert Kesselplatte und zwingt uns, unsere zu bewegen Logik weit weg von wo es verwendet wird. Im Gegensatz dazu, einige andere Sprachen, wie Perl, bieten eine dedizierte "foreach" Konstrukt, das automatisiert dieser Prozess. BOOST_FOREACH ist einfach ein solches Konstrukt für C ++. Es iteriert über Sequenzen für uns, die uns befreien sich direkt mit Iteratoren beschäftigen oder schreibe Prädikate.
BOOST_FOREACH ist konzipiert für Benutzerfreundlichkeit und Effizienz. Es tut nicht dynamische Zuordnungen, macht keine virtuelle Funktionsaufrufe oder Anrufe durch Funktionszeiger und führt keine Aufrufe aus die sind nicht transparent für die Compiler-Optimierer. Das führt zu nahezu optimale Codegenerierung; das Leistung von BOOST_FOREACH ist in der Regel innerhalb von ein paar Prozent der gleichwertige handcodierte Schleife. Und obwohl BOOST_FOREACH ein Makro ist, ist es ist ein bemerkenswert gut erzogener. Es wertet seine Argumente genau einmal aus, zu keinen bösen Überraschungen führen.
Es gibt ein BOOST_AUTO Makro, das mehr oder weniger was macht auto keyword ... Ein Blick auf die Implementierung zeigt jedoch, dass es viel besser ist, einen Weg zu finden, C ++ 0x zu verwenden: & gt;
Sie können diese Makros verwenden, um dies in einer standardkonformen Weise zu umgehen.
%Vor%So wird Ihre for-Schleife
%Vor%Der Kredit geht an Bedingte Liebe: FOREACH Redux , von Eric Niebler. Bin mir nicht sicher, ob es sich wirklich lohnt:)
Das unmittelbare Problem besteht darin, Informationen vom abgeleiteten Typ in eine Datenmemberdeklaration zu übernehmen.
%Vor% Das wird eindeutig nicht passieren, weil das Objekt AUTO
vor dem Aufruf der Funktion zugewiesen werden muss.
Gegeben typeof
oder decltype
, aber es ist nicht so schwer.
Das hat natürlich viele Einschränkungen. Und typeof
ist kein Standard. Mit mehreren Compiler-Unterstützung wäre dies wahrscheinlich die Grundlage für diese Boost-Tools.