Mithilfe einer Vorlage callback-Funktion in C++
Ich will eine Funktion, die prüft, von bestimmten Bedingungen auf der Grundlage des angegebenen callback-Funktion.
Auffassung dieser code:
class Foo{
template <class ParamType>
struct IsGood
{
typedef bool (*Check)(typename const ParamType*, int other);
};
template< typename ParamType >
void DoSmth(IsGood<ParamType>::Check isGood, const ParamType* param){
//...
if(isGood(param, some_int_calculated_here)) doSmthElse();
}
Was ich will, ist, es zu nennen mit:
bool checkEqualInt(int* i, int j){return *i==j;}
bool checkEqualFloat(float* i, float j){return *i==j;}
DoSmth(checkEqualInt, &i);
DoSmth(checkEqualFloat, &i_float);
(Alle gebauten Beispiele zeigen das problem)
Der compiler nicht kommen, und wirft mir Fehler C2664 "konvertieren param 1 von bool(int*,int) bool(ParamType,int) nicht möglich"
Ich da eine Lösung ohne die Verwendung
template< typename ParamType, Check >
void DoSmth(Check isGood, const ParamType param)
Die ommits der notwendigen Deklaration der Funktion prüfen?
Beste Lösung wäre, um die IsGood () - header in der Funktion selbst.
- Ich wollte nicht sehen, dass die Letzte Zeile, bevor er antwortete. Warum ist es, dass die Verwendung eines template-parameter ist ein Funktor ist nicht eine option?
- Für mich funktioniert: ideone.com/czNr1e (nach hinzufügen/entfernen von
typename
wo notwendig). checkEqualFloat
wird nicht funktionieren wenn.- In der Tat, aber nur, weil
checkEqualFloat
wie angegeben, in der Frage nicht mit derIsGood<float>::Check
Funktion Unterschrift. Korrigieren der Signatur, um eineint
als zweiten parameter funktioniert: ideone.com/vx6ao8. - Dein code funktioniert. Ich habe gerade etwas vergessen: Die ParamTypes als Zeiger. Ich aktualisiert die Frage. Tut mir Leid. Ich dachte, dass es derselbe sein. Es funktioniert Aber mit ommitting Zeiger in IsGood und "DoSmth(IsGood<ParamType*>::Check" Aber es sieht seltsam aus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe eines funktors Vorlage Ihre Probleme lösen wird:
Nun können Sie jede Funktion oder Funktor-Objekt, das über eine kompatible Signatur haben(nicht unbedingt eine, die dauert ein
ParamType
und einint
als Parameter). Ansonsten benötigen Sie zur Verwendung von Funktionen mit, die genaue Signatur.Das problem ist, dass das erste argument Ihrer template-Funktion ist nicht ableitbar:
Die einfache Möglichkeit ist das erweitern der Signatur-in-place (C++03,C++11):
Oder wenn Sie C++11 können Sie ersetzen die
IsGood<ParamType>::Check
durch eine template-alias:Oder alternativ umgestalten von code nehmen Sie einen Funktor, die machen es flexibler, einfacher und vielleicht effizienter, da es leichter sein wird für den compiler die inline-call: