c++ +,-,*,/ operatoren als argumente einer function nutzen
c++ +,-,*,/ operatoren als argumente einer function nutzen
Hi,
Wie kann ich einer Funktion einen standart operator als argument (higher order function) uebergeben. Mit jeder anderen funktion geht das, nur eben nicht mit standart operatoren.
Wie kann ich einer Funktion einen standart operator als argument (higher order function) uebergeben. Mit jeder anderen funktion geht das, nur eben nicht mit standart operatoren.
- devilx
- Beiträge: 734
- Registriert: 26.08.2003 22:57:20
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Filderstadt
-
Kontaktdaten:
Indem du sie als string uebergibst?
When you smile, the world smiles with you
When you fart, you stand alone
... a place full of dorkness
When you fart, you stand alone
... a place full of dorkness
Ich habe eine Klasse XY welche als Attribut z.B. dieses hier besitzt:
Nun kann ich dieses Attribut besetzen mit jeder funktion
z.B. plus(int. int), minus(int, int)
Ich moechte aber die standartoperatoren +,-,*,/ nicht in templates, methoden etc. einpacken, die loesen da oben kommt also fuer mich so nicht in frage, auch will ich aus geschwindigkeitsgruenden keine character vergleich ala switch(c) { case '+': ,,, machen.
Ich will wissen, wie ich einer Methode die standartoperatoren +,- ... uebergeben kann und wie ich diese Methode deklariere und aufrufe.
Code: Alles auswählen
void (*ari_func)(int, int);
z.B. plus(int. int), minus(int, int)
Ich moechte aber die standartoperatoren +,-,*,/ nicht in templates, methoden etc. einpacken, die loesen da oben kommt also fuer mich so nicht in frage, auch will ich aus geschwindigkeitsgruenden keine character vergleich ala switch(c) { case '+': ,,, machen.
Ich will wissen, wie ich einer Methode die standartoperatoren +,- ... uebergeben kann und wie ich diese Methode deklariere und aufrufe.
- Savar
- Beiträge: 7174
- Registriert: 30.07.2004 09:28:58
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Berlin
also quasi das sowas funktionieren soll?:
??
Code: Alles auswählen
int berechnung(int a, int b, operator op) {
return (a op b);
}
- BeS
- Moderator
- Beiträge: 3236
- Registriert: 17.04.2002 18:30:21
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Stuttgart
-
Kontaktdaten:
Hallo,
also ich glaube nicht, dass das mit C++ möglich ist.
Aber ich sehe auch nicht wirklich einen Grund warum du das unbedingt brauchst? Es spricht doch nicht wirklich was dagegen den Operator als char zu übergeben.
Wenn ich sowas wirklich brauchen würde, dann würde ich die Funktion in scheme schreiben und in mein C/C++ Programm einbinden.
also ich glaube nicht, dass das mit C++ möglich ist.
Aber ich sehe auch nicht wirklich einen Grund warum du das unbedingt brauchst? Es spricht doch nicht wirklich was dagegen den Operator als char zu übergeben.
Wenn ich sowas wirklich brauchen würde, dann würde ich die Funktion in scheme schreiben und in mein C/C++ Programm einbinden.
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support
Ich spreche von Freier Software!
Ich spreche von Freier Software!
- Savar
- Beiträge: 7174
- Registriert: 30.07.2004 09:28:58
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Berlin
wobei ich es vielleicht eher als Zahl übergeben würde oder zumindest wirklich nur 1 char und für ++ mir ein anderes Zeichen als Alias ausdenken..
wenn du dann per
if(zeichen == '+') {
} else if() {
} else if() {......
das ganze machst und die häufigeren Operatoren als erstes abfragst, sollte es auch recht schnell sein..
switch case könnte eigentlich ähnlich schnell sein
wenn du dann per
if(zeichen == '+') {
} else if() {
} else if() {......
das ganze machst und die häufigeren Operatoren als erstes abfragst, sollte es auch recht schnell sein..
switch case könnte eigentlich ähnlich schnell sein
- BeS
- Moderator
- Beiträge: 3236
- Registriert: 17.04.2002 18:30:21
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Stuttgart
-
Kontaktdaten:
Ich konnte es einfach nicht lassen und hab mal ein kleines Programm mit scheme Aufruf geschrieben.
Ist aber bestimmt nicht performanter wie ein char-Vergleich, da ich ja immerhin einen scheme interpreter anwerfen muß, dafür ist die Funktion nur 4 Zeilen lang, wenn man es darauf anlegt ... Spaß hats trotzdem gemacht
Code: Alles auswählen
#include <stdio.h>
#include <libguile.h>
double calc (char, float, float);
int main (int argc, char *argv[])
{
printf("%f\n", calc('/', 5.0, 4.0));
return 0;
}
double calc (char op, float x, float y)
{
char cmd[50];
SCM ret_val;
scm_init_guile();
/* scheme command erstellen */
sprintf(cmd, "(%c %f %f)", op, x, y);
/* scheme command ausfuehren */
ret_val = scm_c_eval_string(cmd);
return(scm_num2double(ret_val, 0, NULL));
}
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support
Ich spreche von Freier Software!
Ich spreche von Freier Software!
- BeS
- Moderator
- Beiträge: 3236
- Registriert: 17.04.2002 18:30:21
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Stuttgart
-
Kontaktdaten:
Ja, da gibt es doch so ein Sprichwort, dass eine Tätigkeit beschreibt die ab und zu richtig Spaß machen kann, oder?Joghurt hat geschrieben:@BeS, sagen dir die Worte "Kanonen" und "Spatzen" etwas?
Scheme war das erste was mir bei der Frage eingefallen ist, da man da ganz unkompliziert mit Variablen, Opperatoren und Funktionen umgehen kann und das hat meinen Spieltrieb geweckt.
Nur etwas fehlt mir noch. So eine Einbindung könnte vielleicht interessant sein wenn man mit sehr großen Zahlen rechnet (scheme kennt da ja keine Grenzen), wobei dafür gibt es afaik auch eine lib.
Aber egal, auf jedenfall konnte ich nur scm_num2double, scm_num2float,... finden aber nichts womit man das Ergebnis z.B. in einen char-Array schreiben kann wenn es in keine normale Variable mehr passt.
Naja, mal schauen, vielleicht findet sich da noch was...
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support
Ich spreche von Freier Software!
Ich spreche von Freier Software!
Ich Route Pakete in einem Netz. Jedes Paket traegt eine Bitmaske mit sich.
Bitmaskengroessen aendern sich im Laufe der Zeit und ich stehe nicht auf stl also baue ich mit std::bitset nach.
Basis ist eine art array von unsigned int. Nun benoetige ich operatoren fuer diese Klasse welche sich um dieses Array herumlegt.
Nun muss ich fuer jede Operation +, -, * ... dieselbe Schleife bauen.
Das wollte ich eben in eine Higher order function einpacken.
Da das mit den standart-operatoren wohl nicht geht - keiner hats gesehen - bleibt mit noch das einpacken via template.
Oder eben anders aber alles langsamer als gewollt.
Ich sehe gerade, dass hier sowas bereits die stdlib mitbringt, weiss aber nicht, ob das nicht bremst.
/usr/include/c++/3.3/bits/stl_function.h:
Bitmaskengroessen aendern sich im Laufe der Zeit und ich stehe nicht auf stl also baue ich mit std::bitset nach.
Basis ist eine art array von unsigned int. Nun benoetige ich operatoren fuer diese Klasse welche sich um dieses Array herumlegt.
Nun muss ich fuer jede Operation +, -, * ... dieselbe Schleife bauen.
Das wollte ich eben in eine Higher order function einpacken.
Da das mit den standart-operatoren wohl nicht geht - keiner hats gesehen - bleibt mit noch das einpacken via template.
Oder eben anders aber alles langsamer als gewollt.
Ich sehe gerade, dass hier sowas bereits die stdlib mitbringt, weiss aber nicht, ob das nicht bremst.
/usr/include/c++/3.3/bits/stl_function.h:
Code: Alles auswählen
/// One of the @link s20_3_2_arithmetic math functors@endlink.
template <class _Tp>
struct plus : public binary_function<_Tp,_Tp,_Tp> {
_Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; }
};
- BeS
- Moderator
- Beiträge: 3236
- Registriert: 17.04.2002 18:30:21
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Stuttgart
-
Kontaktdaten:
Bist du dir da sicher oder befürchtest du es nur?lisan hat geschrieben:Oder eben anders aber alles langsamer als gewollt.
Wieviele Operatoren hast du denn? Das ist doch nur eine Hand voll, da sollte doch switch-case wirklich kein Problem sein.
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support
Ich spreche von Freier Software!
Ich spreche von Freier Software!