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..