void pointer
-
hallo leute
ich hätte mal eine frage bezüglich void-pointer, die ich gerne verwenden möchte.
und zwar habe ich in einer template-klasse das problem, dass ich je nach template-parameter mir eine liste mit einer kopie der werte machen möchte. In etwa so
template<class Type> Foam::tmp<Foam::GeometricField<Type, Foam::fvsPatchField, Foam::surfaceMesh> > Foam::extendedUpwindCellToFaceStencilR::weightedSum ( const GeometricField<Type, fvPatchField, volMesh>& fld ) const { ... List<List<Type> > ownFld; collectData(ownMap(), ownStencil(), fld, ownFld); const volVectorField& phi = mesh_.lookupObject<volVectorField>("phi"); List<List<vector> > ownPhi; collectData(ownMap(), ownStencil(), phi, ownPhi); ...die funktion collectData belegt mir die liste mit den template-werten. so das problem liegt darin, dass die fld-werte entweder skalare oder vektoren sind und ich bei vektoren aber nicht an die komponenten herankomm. deshalb gibs noch die zusätliche liste ownPhi, die ich mit den gleichen werten belegen lasse. hier muss ich bisher aber die unschöne unterscheidung machen, ob phi skalar oder vektor ist und das die ganze funktion durchziehen.abgebildet ist die vektorversion.
nun war meine idee das ganze mit einem void-pointer zu machen und ihn mit dynamic cast entweder
const volVectorField& phi = mesh_.lookupObject<volVectorField>("phi");oder
const volScalarField& phi = mesh_.lookupObject<volScalarField>("phi");zuzuweisen.
leider machte dann die funktion collectData massive probleme und ich habs aufgegeben.
würde das funktionieren so wie ichs mir ursprünglich vorgestellt habe oder geht da gar nix?
meine versuche kann ich euch morgen posten...gruß und merci
-
Ich denke, das wäre eher ein Fall für TEmplate-Spezialisierung:
template<typename Type> /*...*/ func( const GeometricField<Type, fvPatchField, volMesh>& fld ) { // arbeite mit skalaren Daten } tempate<> /*...*/ func( const GeometricField<vector, fvPatchField, volMesh>& fld ) { // Anpassungen, die für Vektoren nötig sind }(wenn die Gemeinsamkeiten größer sin als die Unterschiede, kannst du die Unterschiede auch in eine Hilfsfunktion auslagern)
-
hm ok.
nur leider bin ich nicht unbedingt allzu sehr mit templates vertraut.
deswegen versteh ichs nicht ganz. dann müsste ich ja eine variable so aufrufen
template<class Type> Foam::tmp<Foam::GeometricField<Type, Foam::fvsPatchField, Foam::surfaceMesh> > Foam::extendedUpwindCellToFaceStencilR::weightedSum ( const GeometricField<Type, fvPatchField, volMesh>& fld ) const { ... GeometricField<Type2, fvPatchField, volMesh> phi = mesh_.lookupObject<GeometricField<Type2, fvPatchField, volMesh> >("phi") ...vielleicht war das vorher etwas unklar, aber der datentyp 'Type' macht probleme. deswegen hol ich mir das ganze nochmal mit 'lookupObject' und schönem datentyp, der entweder 'vector' oder 'scalar' ist. kann ich in ner template klasse nochmal einen anderen template-parameter 'Type2' definieren?
bei 'Type' als vector kann ich nicht an die komponenten des vektors ran, würde das dann bei 'Type2' funktionieren?
-
Du kannst diese Methode einfach zwei Mal definieren und zwar einmal für Type als Vector und Type als Skalar. Das sind ja die zwei Möglichkeiten oder? Und dann hast Du für beide Varianten eine eigene Methoden-Implementierung und kannst da also die Unterscheidung machen, indem Du das einmal komplett für Vector und einmal komplett für Scalar ausprogrammierst. Der Compiler erkennt anhand des übergebenen Typs automatisch, welche Implementierung er aufrufen muss, ganz ohne Casts.
CStoll hat das anhand des Beispiels für Type := vector gezeigt (wie auch immer das bei Dir heißt).
Was reicht Dir an der Lösung nicht?
