| Autor |
Nachricht |
slux
Unregistrierter
|
slux Unregistrierter
16:38:17 22.08.2012 Titel: |
Funktionsparameter bestimmen |
Zitieren |
Hallo Leute,
ich möchte gerne eine Funktion bauen die ähnliche Parameter annehmen kann.
hier mal ein Beispiel
| C++: | 1 2 3 4 5 6 7 8 9 | void foo ( char* var ){
//...
}
void foo ( const char* var ){
//...
}
void foo ( unsigned char* var ){
//...
} | |
Es soll im Grunde jede Art von char Pointer annehmen können, nun weiß ich nicht wie man das schreiben soll. Will nicht unnötig 10 Funktionen definieren und Templates sind jetzt auch nicht wirklich passend. Bin der Meinung irgendwo gesehen zu haben, dass es möglich sei. |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
|
dot Mitglied
16:42:52 22.08.2012 Titel: |
|
Zitieren |
Overloading ist wohl genau das, was du suchst... |
_________________ one point of view will never reveal the entire scene.
|
|
 |
pumuckl
Moderator
Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
|
pumuckl Moderator
17:01:31 22.08.2012 Titel: |
Re: Funktionsparameter bestimmen |
Zitieren |
| slux schrieb: | | Will nicht unnötig 10 Funktionen definieren und Templates sind jetzt auch nicht wirklich passend. | Wenn du das nicht haben willst, was dann? Folgende Möglichkeiten hättest du noch:
Makros -> der nächste der das mitbekommt knüpft dich an der höchsten Rah auf.
Code-Generatoren -> Overkill, wozu auch?
Wenn das Template dir nicht schmeckt, könntest du noch mit enable_if, static_assert & Co die Parametertypen einschränken. Aber vielleicht sollst ja auch für wchar_t's gehen? und für char32_t's, char16_t's und evtl. auch für Mylib::someCrazyFunStuffChar's? |
_________________ Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
|
|
 |
krümelkacker
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.08.2010
Beiträge: 2232
|
krümelkacker Mitglied
17:04:33 22.08.2012 Titel: |
Re: Funktionsparameter bestimmen |
Zitieren |
Was machst du denn dann mit var? Brauchst du noch die Typinformation (also, ob es char, const char, unsigned char, etc war) oder ist dir das egal? Wenn dir das egal ist, kannst du ja sowas machen.
Wenn der Typ wichtig ist, kannst du aus foo auch selbst ein Template basteln und entsprechend auf char-Typen beschränken per enable_if. |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3217
|
Sone Mitglied
17:14:03 22.08.2012 Titel: |
|
Zitieren |
Eigentlich kommt es darauf an, was genau in den Funktionen passiert. Wenn es mehr oder weniger stark von der Größe, Vorzeichenbehaftung oder gar internen Darstellung ( Fließkommazahlen) des Typs abhängig ist, dann ist wohl Überladung und/oder Einschränkung gut. Dabei sollte man dann beachten, Redundanz zu minimieren, sprich dass nicht alle Überladungen bis auf ein Detail gleich sind (in diesem Fall, Typ-Unabhängige Operationen einfach in Funktions-Templates auslagern). |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
Zuletzt bearbeitet von Sone am 17:15:12 22.08.2012, insgesamt 2-mal bearbeitet |
|
 |
pumuckl
Moderator
Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
|
pumuckl Moderator
18:16:32 22.08.2012 Titel: |
|
Zitieren |
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5798
|
camper Mitglied
18:31:08 22.08.2012 Titel: |
|
Zitieren |
Sowas?| C++: | 1 2 3 4 5 6 7 8 9 10 | #include <type_traits>
struct eat_all_char_ptrs
{
template <typename T, typename = std::enable_if<std::is_integral<T>::value&&std::is_same<typename std::make_signed<typename std::remove_cv<T>::type>::type,char>::value>::type>
eat_all_char_ptrs(T* p) : p(p) {};
const volatile void* p;
};
void foo(eat_all_char_ptrs); | | |
Zuletzt bearbeitet von camper am 18:31:18 22.08.2012, insgesamt 1-mal bearbeitet |
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3217
|
Sone Mitglied
18:40:38 22.08.2012 Titel: |
|
Zitieren |
| pumuckl schrieb: | | Sone schrieb: | Wenn es mehr oder weniger stark von der Größe, Vorzeichenbehaftung oder gar internen Darstellung ( Fließkommazahlen) des Typs abhängig ist | | slux schrieb: | | Es soll im Grunde jede Art von char Pointer annehmen können, |
Je nachdem welche char-Typen er meint, kommt von alledem nur die Größe oder garnichts in Betracht  |
Das das so nicht ist, hab ich nicht behauptet, meine Aussage war einfach etwas allgemeiner gefasst.
Kein Grund gemein zu werden. |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
|
dot Mitglied
22:15:45 22.08.2012 Titel: |
Re: Funktionsparameter bestimmen |
Zitieren |
| slux schrieb: | | Es soll im Grunde jede Art von char Pointer annehmen können, nun weiß ich nicht wie man das schreiben soll. |
Was genau meinst du damit? Wenn es sich um verschiedene Typen handelt, wirst du in aller Regel wohl auch verschieden damit umgehen wollen, ansonsten hast du wohl sehr wahrscheinlich grad was, sagen wir mal, nicht unbedingt Elegantes vor... |
_________________ one point of view will never reveal the entire scene.
|
|
 |
krümelkacker
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.08.2010
Beiträge: 2232
|
krümelkacker Mitglied
01:34:06 23.08.2012 Titel: |
|
Zitieren |
| camper schrieb: |
Sowas?
...
|
Das'ja lustig. Hatte einen ähnlichen Einfall und nannte ihn auch "sowas" |
|
|
|
 |