2012-03-25 17 views
0

Ich konvertiere Fortran-Code nach C++ und wollte eine richtige Option für den Funktionszeiger finden.C++ Funktionszeiger 'Basis'

Der Fortran-Code ist: Für zwei verschiedene Fälle übergibt er zwei verschiedene Arten von Funktionszeigern an eine andere Funktion. Diese Funktionszeiger haben unterschiedliche Schnittstellen. In C++ muss ich die Schnittstelle des Funktionszeigers angeben und daher ist es nicht einfach. Kann jemand vorschlagen, ob C++ - Funktor oder etwas anderes, das wäre nützlich? Ich wünschte, ich könnte etwas wie "void (function) pointer" und dann "cast" verwenden, aber ich weiß es wirklich nicht. Danke im Voraus.

EDIT: minimal Beispiel in Fortran

Fortran

if(option1) then 
call myfunc(abc_function_pointer,otherarguments) 
else 
call myfunc(xyz_function_pointer, otherarguments) 
endif 

wo diese Funktionen sind (in C++)

void (*abc_function_pointer)(int, float) //in c++ 
void (*xyz_function_pointer)(int, int, int) //in c++ 
+0

Es fällt mir schwer zu verstehen, was der ursprüngliche Code tut (auf hoher Ebene, nicht auf Implementierungsebene), daher ist es schwer, eine C++ - Lösung vorzuschlagen. Könnten Sie vielleicht ein minimales Pseudocode-Beispiel angeben? –

+0

Warum verwenden Sie nicht Klassen und Polymorphie? – littleadv

+0

Können Sie die Funktion überladen? Eine Version akzeptiert (zum Beispiel) int * f1 (int), und eine andere Version akzeptiert (zum Beispiel) int * f2 (double, int). –

Antwort

1

Generell dies eine schlechte Idee ist. Überlegen Sie - was soll myfunc mit diesem Funktionszeiger machen? Was passiert, wenn Sie es abc_function_pointer übergeben, aber es versucht, es mit drei int s zu nennen? Oder umgekehrt?

Ohne zu wissen, wofür Sie das verwenden, ist es schwer zu sagen, was Sie tun sollten. In der Regel möchten Sie die gemeinsame Schnittstelle zwischen abc_function_pointer und xyz_function_pointer ausklammern, sodass myfunc immer eine Funktion mit demselben Typ und derselben Schnittstelle aufruft. Sie können eine Shim-Funktion einfügen, die zwischen der allgemeinen Schnittstelle und der von abc_function_pointer oder xyz_function_pointer konvertiert.

+0

Würde er keine inkompatiblen Kompilierfehler vom Zeigertyp bekommen, wenn er versucht, verschiedene Funktionszeigertypen zu übergeben, es sei denn, 'myfunc' wurde überladen, um beides zu akzeptieren? – Collin

+0

@CollinHockey, in der Tat würde er, und er ist anscheinend auf die Frage kommentiert. Es gibt Problemumgehungen (Funktionszeiger-Casting), aber diese verschieben das Problem einfach von einem, das zur Kompilierungszeit erkannt wird, zu einem Problem, das zur Laufzeit unvorhersehbares Verhalten verursachen kann. – bdonlan