Gå til innhold

Hvordan sette inn valgfri template i deklarasjon


Anbefalte innlegg

I mitt program har jeg et objekt som fungerer som interface mellom programmereren og numerisk løsning av differensialligninger. Når det deklareres sendes det med en struct som forteller hvilken metode den skal bruke. Eksempel med fjerde ordens Runge-Kutta.

 

ODEsolver< RK4 > solver(/*parametre*/);
solver.Integrate();

 

RK4 er en egen struct. Det er også andre og jeg har flere løsningsmetoder jeg skal teste på samme fysiske problem og jeg vil kunne sette inn hvilken metode jeg vil bruker basert på input fra brukeren eller en configfil. Jeg klarer ikke å se hvordan jeg skal gjøre dette. For å skissere hva jeg har lyst på:

 

if (input=="RK4") {
   #typedef placeholder RK4
}

ODEsolver<placeholder> solver(/* parametre */);

 

Her blander jeg åpenbart direktiver med øvrig kode og alt er på trynet, men jeg illustrerer hva jeg har lyst på :p Er det noen som vet hvordan jeg kan løse dette?

Endret av Øsse
Lenke til kommentar
Videoannonse
Annonse

I mitt program har jeg et objekt som fungerer som interface mellom programmereren og numerisk løsning av differensialligninger. Når det deklareres sendes det med en struct som forteller hvilken metode den skal bruke. Eksempel med fjerde ordens Runge-Kutta.

 

ODEsolver< RK4 > solver(/*parametre*/);
solver.Integrate();

 

RK4 er en egen struct. Det er også andre og jeg har flere løsningsmetoder jeg skal teste på samme fysiske problem og jeg vil kunne sette inn hvilken metode jeg vil bruker basert på input fra brukeren eller en configfil. Jeg klarer ikke å se hvordan jeg skal gjøre dette. For å skissere hva jeg har lyst på:

 

if (input=="RK4") {
   #typedef placeholder RK4
}

ODEsolver<placeholder> solver(/* parametre */);

 

Her blander jeg åpenbart direktiver med øvrig kode og alt er på trynet, men jeg illustrerer hva jeg har lyst på :p Er det noen som vet hvordan jeg kan løse dette?

 

jeg tror heller jeg ville valgt en factory pattern, med arv her. med templates så må du jo kjenne typen som du sender med i <> parameterne dine (og det vil jo være dynamisk).

 

Jeg er hvertfall ikke dreven nok med templates til å umiddelbart se løsning på problemet ditt vha templates. (og er ikke sikker på om det er noen god løsning på problemet ditt her)

 

struct Base { 
 virtual void Integrate() = 0;
...
};
struct RK4 : public Base { 
 virtual void Integrate() { ... }

... };

Base* likning;
if (input == "RK4")
{
 likning = new RK4( ... );
}
else if (input == "meh")
{
 likning = new MEH( ... );
}

ODEsolver solver(likning);
solver.Integrate();

 

ble kanskje litt rotete skrevet av meg det her, men jeg mener hvertfall at baseobjekter og arv høres ut som en grei løsning i dette tilfellet

Lenke til kommentar

Hei og takk for svar. Det du foreslår er sikkert mulig men jeg tror det vil involvere en enorm endring av koden min. Jeg bruker kode fra Numerical Recipes og jeg er ikke sikker på om jeg klarer å modifisere koden slik du foreslår. Jeg må i så fall lage en helt virtuell klasse som ODEsolver arver fra.

 

Jeg kan formulere problemet mitt mye enklere, egentlig. Jeg vil at brukeren av programmet skal kunne velge om programmet skal deklarere en vector<int> eller en vector<double> baset på input til programmet.

Lenke til kommentar

jeg tror du da må lage to if blokker..

if (input == "double")
{
 vector<double> list;
 // all logikken her
 solve(list);
}
else if (input == "integer")
{
 vector<int> list;
 solve(list);
}

 

finnes sikkert mer elegante løsninger der ute.. Men er sikkert mutlig, bare se hva de klarer i boost! ;) Men jeg uansett er jeg ganske sikker på at compileren resolver templaten compile time, så jeg tror ikke det er mulig å gjøre

var< input == "double" = double : float>.. (den syntaksen her vil aldri funke, men mer tanken altså)

Men her er det godt mulig jeg tar feil.

Endret av [kami]
Lenke til kommentar

Hei, og takk for svar igjen :) Det var akkurat det jeg var redd for, å ha flere svære if-blokker nedover. Det er jo ikke et problem egentlig. Jeg bare liker det ikke så godt :p Jeg skulle hatt en måte å deklarere objektet på før den første if'en. Det jeg kan gjøre er å opprette objekter for alle metodene med new , så sletter if'ene alle de andre den ikke trenger.

 

Mitt program er jo såpass lite uansett at jeg kan sikkert ha hundrevis av ubrukte objekter rundt omkring. Jeg lurer mest på om det er en skikkelig måte å gjøre det på. Jeg har søkt på Google men har ikke funnet noe svar. Det du skrev over er det nærmeste jeg har kommet, men som sagt så tror jeg ikke at jeg får til å tilpasse den teknikken til mine klasser/structerr.

 

Jaja :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...