Sinn von bezeichnerlosen Übergabeparametern
-
Hi!
Hab mich da grad was gefragt.
Wofür sind bezeichnerlose Übergabeparameter in einer Funktion nützlich ?
Also a laint funktion(int);Gesehen hab ich Sie schon beim Überladen des Postfix Inkrement/Dekrementierungs-Operators, wo werden die sonst noch nützlich gemacht ?
-
Abend,
du musst schon zwischen einer Deklaration und einer Definition unterscheiden. Eine Deklaration macht dem Compiler "nur" etwas bekannt, ihn interessiert den Namen deiner Parameter nicht, darum kannst du ihn bei einer Funktionsdeklaration weglassen. Dein Beispiel ist nämlich eine Funktionsdeklaration, auch genannt Prototyp einer Funktion.
Bei Postfix und Prefix ist es aber etwas ganz anderes. Hier dient es dazu, zu unterscheiden, was nun Postfix und was Prefix ist.
-
Bei der Funktionsdeklaration sind die Parameternamen sowieso egal, also kann man sie auch weglassen, wenn man meint sie nicht zu brauchen. Ansonsten kann es sein, daß eine Funktion technisch ein bestimmtes Interface erfüllen muß, aber die dazugehörigen Parameter nicht benötigt.
-
Wenn du zum Beispiel anhand eines Compiletime-Werts überladen möchtest, dient der Parameter nur der Markierung.
template <bool> struct bool_to_type {}; template <typename T> void my_copy(const T* src, T* dest, std::size_t count, bool_to_type<false> /* namenlos */) // für non-pods { while(count--) *dest++ = *src++; } template <typename T> void my_copy(const T* src, T* dest, std::size_t count, bool_to_type<true> /* namenlos */) // für pods { std::memcpy(dest, src, count * sizeof(T)); } template <typename T> void my_copy(const T* src, T* dest, std::size_t count) { my_copy(src, dest, count, bool_to_type<std::is_pod<T>::value>()); // hier wird entschieden, ob der pod oder der non-pod algorithmus aufgerufen wird }
-
Danke !
-
Und wenn man ne Funktion nur deklariert, kann man es ja meistens auch weglassen. Zb bei
void copy_to_buffer(void const*, std::size_t);Wird sicher jeder denken können was los ist und man spart sich unter Umständen Zeilenumbrüche etc
-
Bei der Deklaration würde ich Parameternamen nicht weglassen (ausser wenn es wirklich nur um den Typ geht, z.B. bei
operator++(int)oder wie in Pis Beispiel). Schliesslich ist das der für den Aufrufer relevante Teil. asc würde sagen, man sollte gegen die Schnittstelle und nicht gegen die Implementierung programmieren