2012-11-10 24 views
10

Ich frage mich, ob es eine einfache Möglichkeit gab, einen Alias ​​einer C++ - Klassenfunktion zu schreiben. Zum Beispiel, wenn ich einige list Container-Objekt haben, wäre eine logische FunktionC++ Klassenfunktion Aliase

int list::length() { return len; } 

Aber ein weiterer logischer Alias ​​sein, dass Programmierer könnte könnte So

int list::size() { return len; } 

, statt zu schreiben beide Funktionen mit ihrer vollen benutzen, Körper, gibt es eine Möglichkeit, list::size() ein Alias ​​von list::length() so zu machen, dass es kein Doppel ist, wenn kompiliert, sondern verweist auf die gleiche Funktion?

Ich habe gelesen, dass Sie dies mit #define tun können, aber ich möchte keine Verwechslung mit anderen Code-Namen irgendwo völlig außerhalb des Umfangs (d. H. Eine 'Größe' Variable) verursachen.
Ich habe auch gelesen, dass Funktionszeiger es beheben können, aber das ist nicht genau ein Alias ​​(da es de-referenzieren muss), noch Funktion Zeiger können eine Deklaration gegeben werden, die es eine verwirrende Help-Line zu geben Benutzer (ich würde denken), plus die Verwirrung, wenn ich jemals meinen Code in ein anderes Objekt verschachteln muss (ich muss den Umfang justieren).

inline int list::length() { return len; } 
    inline int list::size() { return length(); } 

Oder gibt es eine strenge ‚alias‘ Syntax für C++:

Eine meiner Vermutungen ist, wird die folgende als eine direkte Funktion alias von den meisten optimierende Compiler genommen werden? (Ich konnte keine finden - war mir nicht sicher)
Also, was wäre der effizienteste Weg, dies zu tun?

EDIT: Ich habe die Antwort einfach akzeptiert, um die Frage zu beenden, da es nur eine Kuriosität von mir ist. Jeder mit guten Informationen, bitte fügen Sie Kommentare oder Antworten, und ich kann sogar meine Antwort ändern.

+0

Aliasing in C++ wird normalerweise durch Referenzen durchgeführt, die wie Zeiger funktionieren und die Notwendigkeit der Dereferenzierung hinzufügen. – imreal

+1

Ihr Endcode sollte die gleiche Assembly für beide Funktionen von jedem modernen Compiler erzeugen, wenn ich richtig bin. – chris

+0

Gute Frage. Ich denke, ein Schritt dahin wurde in "C++ 11" gemacht, indem man Standardfunktionen und gelöschte Funktionen zuließ. Wenn 'int foo() = delete' ok ist, warum kann' int foo() = int foo_default() 'aus den angegebenen Gründen nicht in Ordnung sein? Vielleicht im nächsten Standard :) Soweit ich weiß gibt es momentan keinen besseren Weg, als explizit auf die andere Funktion im Körper zu verweisen. – SomeWittyUsername

Antwort

4

Ich würde den Präprozessor und #define nicht verwenden, um dies zu tun. Im Allgemeinen sollte der Präprozessor ein letzter Ausweg in C++ sein. Siehe hierzu C++ FAQ on inline functions, die auch einen Abschnitt über die verschiedenen Nachteile der Verwendung von Makros des Präprozessors enthält.

Der Ansatz wäre ich verwenden würde, eine Funktion zu haben, die mehrere unterschiedliche Aliase mit einer komplizierteren Funktion und Schnittstelle haben, werden Sie etwas wie das folgende tun würde:

int list::length(string xString, int iValue) { 
    int iReturnValue = 0; // init the return value 
    // do stuff with xString and iValue and other things 
    return iReturnValue; 
} 

Dann tun so etwas wie die folgenden für ein Alias.

inline int list::size(string xString, int iValue) {return length(xString, iValue);} 

Die Inline sollte im Grunde nur den Alias ​​mit dem eigentlichen Funktionsaufruf ersetzen.

Siehe auch diese stack overflow posting Giving a function implementation more than one name. Es bietet einige Gründe, warum Sie dies möglicherweise nicht möchten.

+0

Also, ich denke, meine Frage darüber wäre, Inline-Funktionen noch Stapel Argumente; würde dies einen Doppelstapel anwenden? dh Stapelparameter für die Funktion "list :: size" und dann stapeln Sie einen weiteren Satz von Parametern für den internen Funktionsaufruf "list :: length", da der Compiler erwarten könnte, die Argumente "list :: size" auf verschiedene Arten wiederzuverwenden außer sie einfach wieder runter zu schicken? Oder fangen Compiler das auf und wenden nur einen Stack an? Ich weiß, dass es auf modernen Systemen nicht wirklich eine Optimierung ist, aber ich war nur neugierig .. – Codesmith

+0

@AUTO, Hier ist eine FAQ zu Inline-Funktionen (http://www.parashift.com/c++faq/inline-functions). html). Die Idee einer Inline-Funktion ist, dass der Compiler keinen Aufruf an die Funktion generiert, sondern den Quelltext der Funktion übernimmt und ihn inline kompiliert, wobei der Funktionsaufruf durch den generierten Objektcode der Funktion ersetzt wird. Aus diesem Grund kann es zu einem aufgeblähten Code führen. –