Hallo,
folgende Problematik.
Ich habe zwei generische Funktionen geschrieben, die Minimum und Maximum
einer Funktion finden. Das Interface sieht so aus:
1
// Iteratively find a local minimum or maximum of a
2
// function in a given interval
3
4
// The function to be minimized / maximized takes one
5
// double argument and returns a double:
6
7
typedefdouble(*fnptr_type)(double);
8
9
// - lower_bound and upper_bound define the initial search interval
10
// - the iteration stops when max_iterations have been performed
11
// or the current search interval is smaller than residual_error
Jetzt würde ich gerne aus einer Klasse heraus, für eine Methode dieser
Klasse, ein Minimum suchen.
Also zum Beispiel mit calculate_this aus dieser Klasse:
Jetzt kann ich die Methoden-Klasse nicht als Funktionspointer übergeben,
weil Typ und Kontext nicht stimmen. Wie löst man so ein Problem am
besten?
Sollte ich die Klasse technical_thing von einer Mimimizer-Klasse
ableiten? Oder gibt es einen sinnvollen Weg, den Typ zu casten, so dass
die Übergabe des Funktionspointers klappt?
Ich hoffe das Problem ist verständlich beschrieben.
Du solltest das Interface Deiner Funktion auf `std::function<
dobule(double) >` ändern. Dann kann der Aufrufer beliebige
Konvertierungen verwenden, um alles mögliche auf diese Form zu bringen
(z.b. auch Funktionen mit mehreren Parametern).
Wenn du std::function akzeptierst, kannst du mit std::bind auch
Member-Funktionen übergeben. Alternativ kann man auch Lambdas nehmen,
was etwas intuitiver ist:
Alternativ könntest Du aus Deinen Funktionen aber auch ein Template
machen, und die Funktion als "etwas" (T) übergeben, dass sich wie eine
Funktion (double (double)) verhält:
Herkömmliche Funktionspointer auf Memberfunktionen funktionieren nur
ohne "this"-Pointer, dazu müssen sie als static deklariert werden.
static hat damit in C++ eine komplett andere Bedeutung als in C.
Wenn eine Memberfunktion einer Klasse mit einer Objektinstanz arbeiten
soll, muss der benötigte "this"-Pointer als Argument beim
Funktionsaufruf mitgegeben und in der Memberfunktion jeweils explizit
genutzt werden.
Rufus Τ. F. schrieb:> Herkömmliche Funktionspointer auf Memberfunktionen funktionieren nur> ohne "this"-Pointer, dazu müssen sie als static deklariert werden.>> static hat damit in C++ eine komplett andere Bedeutung als in C.
Naja, C++ hat einen Kontext (Klassen), den es in C nicht gibt. An den
Stellen, wo es auch in C static gibt, hat es die selbe Bedeutung wie in
C++.