Funkoren/Funktionen als Parameter



  • Hi,
    Folgende Ausgangsituation:

    Ich habe eine Überladene Funktion
    rand();
    rand(int);

    und in einer Klasse eine Member Templatefunktion, der ein RND-Generator als Funktor/Funktion übergeben werden soll:

    template <class RanomNumberGen>
    shuffle(RanomNumberGen rand);

    Allerdings meckert beim aufruf von shuffle

    Klassse x;
      x.shuffle(&rand);
    

    Der kompiler, dass die Funktion rand ambiguous ist.
    Wie kannich den Kompiler sagen, dass ich die 2. Variante meine.
    x.shuffle(&rand(int));
    funktioniert leider nicht.

    Schon mal Danke für eure Hilfe.
    Vlad



  • x.shuffle<int(*)(int)>(&rand);
    //oder
    x.shuffle(static_cast<int(*)(int)>(&rand));
    

    Wobei ich das erste vorziehen würde.

    Felix



  • Vielleicht hilft explizit das Template Argument anzugeben.
    Simon



  • ok, Danke! Hätte man auch selbst drauf kommen können. 🙄

    Noch was:
    Wie kann ich für diese Funktion auch ein standard Parameter festlegen?

    template <class RanomNumberGen> 
    shuffle(RanomNumberGen rand=MyRND()); 
    
    //Aufruf:
    x.shuffle();
    

    geht leider nicht, ohne x.shuffle<MyRND>(); obwohl das templateargument ja bekannt sein sollte.
    Oder mus ich da eine Templatelose funktion hinzufügen?



  • template <class RanomNumberGen>
    shuffle(RanomNumberGen rand=RanomNumberGen());
    


  • template <class RanomNumberGen>
    shuffle(RanomNumberGen rand=RanomNumberGen());
    

    Ich möchte ja aber, dass man schreiben kann:
    x.shuffle(); // kompatibilität zu vorhandenen Code;
    und nicht
    x.shuffle<MyRND>();

    aber dann wahrscheinlich einfach eine templatelose memberfunction:

    void shuffle()
    {
      shuffle<MyRND>();
    };
    

    Ich dacht halt, dass kann man sich vielleicht irgendwie sparen



  • template <class RanomNumberGen = MyRND>
    shuffle(RanomNumberGen rand=RanomNumberGen());
    

    Dann war meine erste Version doch das, was du wolltest. 😉
    (habs relativ schnell wegeditiert, weil ich dachte, dass du einen WERT haben willst..


Anmelden zum Antworten