Passere et enhetlig predikat til en funksjon i C ++

stemmer
2

Jeg trenger en funksjon som etablerer en politikk for klassen min for å vise elementer. f.eks:

SetDisplayPolicy(BOOLEAN_PRED_T f)

Dette er forutsatt BOOLEAN_PRED_T er en funksjonspeker til noen boolsk predikat typen som:

typedef bool (*BOOLEAN_PRED_T) (int);

Jeg er bare interessert i f.eks: vise noe når bestått predikat er TRUE, vises ikke når det er falsk.

Eksempelet ovenfor fungerer for funksjoner retur bool og tar en int, men jeg trenger en veldig generisk pekeren for SetDisplayPolicy argument, så jeg tenkte på UnaryPredicate, men det er boost relatert. Hvordan kan jeg passere en enhetlig predikat til en funksjon i STL / C ++? unary_function< bool,T >vil ikke fungere fordi jeg trenger en bool som returverdi, men jeg ønsker å be brukeren bare for ensartet funksjon som returnerer bool, i den mest generiske tilnærmingen.

Jeg tenkte på å avlede min egen type som:

template<typename T>
class MyOwnPredicate : public std::unary_function<bool, T>{};

Kan det være en god tilnærming?

Publisert på 01/07/2009 klokken 06:26
kilden bruker
På andre språk...                            


2 svar

stemmer
5

Du er på rett spor da unary_function er ment som en base klasse. Vær imidlertid oppmerksom på at den første parameteren er ment å være den argument_type og den andre er result_type. Deretter er alt du trenger å gjøre implementere operatør ()

template<typename T>
struct MyOwnPredicate : public std::unary_function<T,bool>
{
    bool operator () (T value)
    {
        // do something and return a boolean
    }
}
Svarte 01/07/2009 kl. 06:49
kilden bruker

stemmer
4

Slå SetDisplayPolicyinn en funksjon mal:

template<typename Pred>
void SetDisplayPolicy(Pred &pred)
{
   // Depending on what you want exactly, you may want to set a pointer to pred,
   // or copy it, etc.  You may need to templetize the appropriate field for
   // this.
}

Så å bruke, gjør du:

struct MyPredClass
{
   bool operator()(myType a) { /* your code here */ }
};

SetDisplayPolicy(MyPredClass());

I displayet koden du vil da d some som:

if(myPred(/* whatever */)
   Display();

Selvfølgelig kan du funktor må ha en stat, og du vil kanskje sin konstruktør å gjøre ting, etc. Poenget som SetDisplayPolicyikke bryr seg hva du gir den (inkludert en funksjonspeker), forutsatt at du kan feste et funksjonskall på det og komme tilbake en bool.

Edit: Og som CSJ sagt, du kan arve fra STL er unary_functionsom gjør det samme, og vil også kjøpe deg de to typedefs argument_typeog result_type.

Svarte 01/07/2009 kl. 06:50
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more