Boost::random Parametrisierung von Templates in C++?
-
Hallo zusammen,
ich würde gerne boost Random Number Library nutzen aber auf eine abstrakte Ebene durch eine Parametrisierung die eine bestimmte Ausprägung von boost::variate_generator erzeugt. Jedoch gelingt es mir nicht eine Art Parametrisierung von Templates zu implementieren. Ich habe folgendes gemacht
Eine Basis Klasse Engine implmentiert und in abgeleiteten Klassen einigen boost Engines benutz. Dann habe ich ein Factory implementiert damit ich zu einem string eine bestimmte Klasse erzeuge. Z.B.
class BaseEngine() { ...
class mt199937:BaseEngine { ... boost::mt19937 m_eng;//member variable
Eine bestimmte Ausprägung von BaseEngine wird so erzeugt
EngineFactory::Create(engType); //engType ist IntGenau das gleiche habe ich für Distributions gemacht und bestimmte Ausprägunen so erzeugt:
DistributionFactory::Create(distType);Nun wollte ich Engine und Distribution zusammenlinken und habe eine Klasse Generator implementiert die Engine und Distribution als m_variable hat. Jedoch damit ich boost::variate_generator definieren will brauche ich so was zu machen:
z.B. variate_generator<Type Engine,Type Distribution> vg(Engine,Distribution);
Eine switch statement will ich vermeiden und würde gerne vg in dem ich meine Klassen Engine und Distribution benutze "schalau" erzeugen. Hat jemand eine bessere Idee oder eine Idee wie ich weiter machen kann? Danke mehrmals im Voraus und entschuldigt ihr bitte mein Deutsch
-
Wären nicht Template-Spezialisierungen eine Möglichkeit?
Als Templateparameter könntest du zum Beispiel
enum
-Werte benutzen (wenn du von Boost abstrahieren willst) oder sonst ganz normale Typen, für die du die Boost-Klassen einsetzt.
-
Das Problem ist, so wäre meine Umsetzung nicht allgemein genug. Ich will nicht jedes mal speziell angeben was für eine Klasse ich nutze. Viel mehr will ich über eine Parametrisierung die Objekterzeugung trennen, so dass ich eine beliebige Ausprägung von dem Generator kreiren kann, nur unter Benutzung von einem Schlüßel (z.B. INT32)
Danke für die Antworte!