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 der IsGood<float>::Check Funktion Unterschrift. Korrigieren der Signatur, um eine int 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
InformationsquelleAutor Flamefire | 2013-08-23
Schreibe einen Kommentar