c++ +,-,*,/ operatoren als argumente einer function nutzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

c++ +,-,*,/ operatoren als argumente einer function nutzen

Beitrag von lisan » 30.03.2005 10:41:27

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.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.03.2005 10:44:05

kleines Anwendungsbeispiel?
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
devilx
Beiträge: 734
Registriert: 26.08.2003 22:57:20
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Filderstadt
Kontaktdaten:

Beitrag von devilx » 30.03.2005 10:57:38

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

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 30.03.2005 11:11:45

Ich habe eine Klasse XY welche als Attribut z.B. dieses hier besitzt:

Code: Alles auswählen

void (*ari_func)(int, int);
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.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.03.2005 11:16:47

also quasi das sowas funktionieren soll?:

Code: Alles auswählen

int berechnung(int a, int b, operator op) {
   return (a op b);
}
??
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 30.03.2005 12:01:40

Ich denke ja ;)

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.03.2005 12:13:59

hmm.. auch wenn ich es nicht genau sagen kann, aber mir ist nicht bewusst, das sowas geht. Warum nimmst du nicht einfach für jeden Operator eine Funktion oder versuchst es über Templates? Willst du Platz sparen?
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 30.03.2005 12:28:53

Laufzeit will ich sparen, das einpacken ist zu teuer - dachte ich mir ;) muss nicht richtig sein.
ich haette vermutet, dass es fuer die std.-operatoren synonyme gibt.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.03.2005 12:31:20

was soll die klasse denn genau machen? du kannst ja vielleicht auch die operatoren für die Klasse überladen.. musst du zwar auch für jeden Operator das machen, aber vielleicht findest du es ja praktisch für das, was du machen möchtest..
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 30.03.2005 13:36:34

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. ;)
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.03.2005 13:42:02

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
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 30.03.2005 14:19:30

Ich konnte es einfach nicht lassen und hab mal ein kleines Programm mit scheme Aufruf geschrieben. :D

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));
}
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 ;)
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 30.03.2005 17:06:04

@BeS, sagen dir die Worte "Kanonen" und "Spatzen" etwas? 8)

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 30.03.2005 17:50:12

Joghurt hat geschrieben:@BeS, sagen dir die Worte "Kanonen" und "Spatzen" etwas? 8)
Ja, da gibt es doch so ein Sprichwort, dass eine Tätigkeit beschreibt die ab und zu richtig Spaß machen kann, oder? :lol:

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... :D
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 30.03.2005 19:47:41

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:

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; }
};

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 30.03.2005 19:55:34

lisan hat geschrieben:Oder eben anders aber alles langsamer als gewollt.
Bist du dir da sicher oder befürchtest du es nur?
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!

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 01.04.2005 09:37:43

Na alles was man mit einer bitmaske so anstellen kann, +,-,&,| ... .
Ich bin mal mitm gcc durchgestept und hab mir mal mit valgrind ein profil angeschaut - es ist etwas lamer.

Antworten