<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Template Vererbung - Funktion von Kind aufrufen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Leider kann man keine virtual Template Methoden deklarieren. D.h. also dass ein Vorfahre keine kinderspezifische Versionen seiner Methoden aufrufen kann. Das ist überaus ärgerlich, denn so bin ich gezwungen dutzendweise den gleichen (langen) Code zu implementieren, wieder und wieder. Es sei denn es gibt da doch noch eine Lösung?!</p>
<p>Ich schreibe Plugins für VTK (irgendeine VisualisierungsAPI halt). Diese Plugins leitet man von einer Klasse ab, die ich einfach mal &quot;FilterPlugin&quot; nenne (der wirklich Name ist so lang wie die Anmerkung hier). Hier soll man dann processImage(...) überschreiben.</p>
<p>Da ich aber mit anderen Bildtypen arbeiten muss als dass was ich von processImage bekomme muss ich eine Konvertierung durchführen bevor ich mit der Bildbearbeitung loslege, und dafür muss ich mit Template Funktionen arbeiten.</p>
<p>Wenn die Konvertierung abgeschlossen ist kommt der eigentliche Filter (applyFilter(...)), wovon ich seeehr viele Varianten schreiben möchte. Deswegen möchte ich diese Funktion gerne überschreiben. Dummerweise muss ich aber hier den Datentypen kennen, also ist das eben eine Template Funktion.</p>
<p>Lange Rede, kurzer Sinn, ich versuche so etwas zu implementieren:</p>
<pre><code class="language-cpp">class A : public FilterPlugin {
    public:
	void processImage(vtkImageData*);	// Anfrage von Extern

    private:
	void detectType(vtkImageData*);		// Datentyp ermitteln
	template&lt;ImageType&gt;
	ImageType* complicatedConversion(vtkImageData*); //aufwändig und groooß...

    protected:
	template&lt;ImageType&gt;
	virtual void applyFilter(ImageType *inputImage) = 0;
}

//////////////////////////////////////////////////////////////////
// Extern übergibt A ein Bild zum Bearbeiten
void A::processImage(vtkImageData* vtkInputImage) {
    //Typ erkennen und Bearbeitungskette starten
    detectType( vtkInputImage );
}

//nach Typerkennung dann applyFilter entsprechend aufrufen
void A::detectType(vtkImageData* vtkInputImage)
{
    scalarType = vtkInputImage-&gt;GetScalarType();	//z.B. VTK_DOUBLE
    if (scalarType == VTK_DOUBLE) {
	typedef ImageType itk::Image&lt; double, 2 &gt;;	//Bildformat festlegen
	// vtkInputImage zu ImageType konvertieren
	ImageType myImage = complicatedConversion&lt;ImageType&gt;( vtkInputImage );
	applyFilter&lt;imageType&gt;( myImage );

    } else if (scalarType == ...) {
	...
    } ...
}

//////////////////////////////////////////////////////////////////
// B braucht sich nicht mehr um den ganzen Konvertierungskram
// zu kümmern und kann direkt mit dem schönen ImageType arbeiten
// B braucht sich auch nicht darum kümmern, wann eine Anfrage kommt,
// denn das macht ja schon A
class B : public A {
    protected:
	template&lt;ImageType&gt;
	applyFilter(ImageType *inputImage);
}

template&lt;ImageType&gt;
void B::applyFilter(ImageType *inputImage)
{
    //hiervon jetzt dutzende von Varianten
}
</code></pre>
<p>... was natürlich nicht geht. Ich sehe irgendwie keine andere Möglichkeit, als ab inklusive der Methode &quot;detectType&quot; den ganzen Kram mit zu den Kindern zu schleppen, weil ja hier die &quot;Template-Kette&quot; losgeht. Ich kann mir dann nur das processImage, also die Kommunikation mit Extern sparen.</p>
<p>Damit könnte ich mich dann für das Projekt mit der größten Code-Redundanz bewerben. Seeehr wartungsfreundlich und unheimlich clever gestrickt... Und jeder einzelne Filter ist 8MB groß, ganz großes Kino <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Hat da jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261506/template-vererbung-funktion-von-kind-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 05:33:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261506.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Feb 2010 12:23:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Fri, 19 Feb 2010 12:23:22 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Leider kann man keine virtual Template Methoden deklarieren. D.h. also dass ein Vorfahre keine kinderspezifische Versionen seiner Methoden aufrufen kann. Das ist überaus ärgerlich, denn so bin ich gezwungen dutzendweise den gleichen (langen) Code zu implementieren, wieder und wieder. Es sei denn es gibt da doch noch eine Lösung?!</p>
<p>Ich schreibe Plugins für VTK (irgendeine VisualisierungsAPI halt). Diese Plugins leitet man von einer Klasse ab, die ich einfach mal &quot;FilterPlugin&quot; nenne (der wirklich Name ist so lang wie die Anmerkung hier). Hier soll man dann processImage(...) überschreiben.</p>
<p>Da ich aber mit anderen Bildtypen arbeiten muss als dass was ich von processImage bekomme muss ich eine Konvertierung durchführen bevor ich mit der Bildbearbeitung loslege, und dafür muss ich mit Template Funktionen arbeiten.</p>
<p>Wenn die Konvertierung abgeschlossen ist kommt der eigentliche Filter (applyFilter(...)), wovon ich seeehr viele Varianten schreiben möchte. Deswegen möchte ich diese Funktion gerne überschreiben. Dummerweise muss ich aber hier den Datentypen kennen, also ist das eben eine Template Funktion.</p>
<p>Lange Rede, kurzer Sinn, ich versuche so etwas zu implementieren:</p>
<pre><code class="language-cpp">class A : public FilterPlugin {
    public:
	void processImage(vtkImageData*);	// Anfrage von Extern

    private:
	void detectType(vtkImageData*);		// Datentyp ermitteln
	template&lt;ImageType&gt;
	ImageType* complicatedConversion(vtkImageData*); //aufwändig und groooß...

    protected:
	template&lt;ImageType&gt;
	virtual void applyFilter(ImageType *inputImage) = 0;
}

//////////////////////////////////////////////////////////////////
// Extern übergibt A ein Bild zum Bearbeiten
void A::processImage(vtkImageData* vtkInputImage) {
    //Typ erkennen und Bearbeitungskette starten
    detectType( vtkInputImage );
}

//nach Typerkennung dann applyFilter entsprechend aufrufen
void A::detectType(vtkImageData* vtkInputImage)
{
    scalarType = vtkInputImage-&gt;GetScalarType();	//z.B. VTK_DOUBLE
    if (scalarType == VTK_DOUBLE) {
	typedef ImageType itk::Image&lt; double, 2 &gt;;	//Bildformat festlegen
	// vtkInputImage zu ImageType konvertieren
	ImageType myImage = complicatedConversion&lt;ImageType&gt;( vtkInputImage );
	applyFilter&lt;imageType&gt;( myImage );

    } else if (scalarType == ...) {
	...
    } ...
}

//////////////////////////////////////////////////////////////////
// B braucht sich nicht mehr um den ganzen Konvertierungskram
// zu kümmern und kann direkt mit dem schönen ImageType arbeiten
// B braucht sich auch nicht darum kümmern, wann eine Anfrage kommt,
// denn das macht ja schon A
class B : public A {
    protected:
	template&lt;ImageType&gt;
	applyFilter(ImageType *inputImage);
}

template&lt;ImageType&gt;
void B::applyFilter(ImageType *inputImage)
{
    //hiervon jetzt dutzende von Varianten
}
</code></pre>
<p>... was natürlich nicht geht. Ich sehe irgendwie keine andere Möglichkeit, als ab inklusive der Methode &quot;detectType&quot; den ganzen Kram mit zu den Kindern zu schleppen, weil ja hier die &quot;Template-Kette&quot; losgeht. Ich kann mir dann nur das processImage, also die Kommunikation mit Extern sparen.</p>
<p>Damit könnte ich mich dann für das Projekt mit der größten Code-Redundanz bewerben. Seeehr wartungsfreundlich und unheimlich clever gestrickt... Und jeder einzelne Filter ist 8MB groß, ganz großes Kino <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Hat da jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858152</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Fri, 19 Feb 2010 12:23:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Fri, 19 Feb 2010 20:28:03 GMT]]></title><description><![CDATA[<p>Nachdem ich mir nun 91 Mal mein eigenes Posting angesehen habe, ist mir immer noch nicht klar, wie ich das Problem lösen kann.</p>
<p>Nach stundenlangem Gefrickel und vielen Versuchen, das Problem aufzudröseln bin ich denke ich an einem Punkt wo ich die Frage etwas anders formulieren kann.</p>
<p>Kann ich den Typ einer Template Klasse zur Laufzeit festlegen, bevor ich sie tatsächlich mit new instantiiere? Das ist doch dynamisch und der Compiler weiß dann ja quasi aus der Methode in der die Instanziierung erfolgt (im Beispiel &quot;setupBox()&quot;), welche Varianten er so brauchen wird. Wie kann ich das realisieren? Ich denke da an folgendes:</p>
<pre><code class="language-cpp">#ifndef XTK_BOX
#define XTK_BOX

template &lt;typename ImageType&gt;
class XTKBox {
    private:
	vtkImageData*	vtkImage;
	ImageType*	itkImage;
    public:
	xtkBox();

	ImageType* 	getITKImage();	//will be called by custom filter
	vtkImageData*	getVTKImage();	//will be called by parent
	void setITKImage( ImageType* );
};

class MagicImageBox {
    // soll eine Instanz von XTKBox werden, aber Typ ist noch nicht klar
    XTKBox&lt;?&gt;	*meineBox;

    public:

	void setupBox() {
	    meineBox = new XTKBox&lt;itk::image&lt;char, 3&gt; &gt;;
	}
}
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1858405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858405</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Fri, 19 Feb 2010 20:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 01:54:28 GMT]]></title><description><![CDATA[<p>Mit Templates bist du grundsätzlich an die Kompilierzeit gebunden. Wahrscheinlich läuft deine Lösung auf eine Kombination von dynamischer und statischer Polymorphie hinaus.</p>
<pre><code class="language-cpp">// soll eine Instanz von XTKBox werden, aber Typ ist noch nicht klar
XTKBox&lt;?&gt;    *meineBox;
</code></pre>
<p>Dieses Fragezeichen ist eben das Problem. Wenn du den Typ zu diesem Zeitpunkt nicht festlegen kannst, hast du kein gültiges Template-Argument.</p>
<p>Könnte nicht sowas funktionieren?</p>
<pre><code class="language-cpp">class ImageBoxBase
{
    // bietet Interface an
};

template &lt;typename ImageType&gt;
class ImageBox : public ImageBoxBase
{
    // konkrete Implementierung mit ImageType
};

class Magic
{
    private:
        ImageBoxBase* myBox;

    public:
        void SetupBox()
        {
            myBox = new ImageBox&lt;KonkretesTemplateArgument&gt;;
        }
};
</code></pre>
<p>Virtuellen Destruktor und <code>delete</code> nicht vergessen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858487</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 20 Feb 2010 01:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 13:30:54 GMT]]></title><description><![CDATA[<p>Vielen Dank, da wär ich nie drauf gekommen. Das sieht prinzipiell sehr gut aus, aber irgendwie schnaggelt mein Compiler da immernoch was nicht:</p>
<pre><code>/home/christian/programming/pv-plugins/Transformations/
ivtkSampleFilter.cxx:22: error: &quot;class XTKBoxBase&quot;
 has no member named &quot;getITKFromVTKImage&quot;
</code></pre>
<p>das betrifft folgende Zeile:</p>
<pre><code class="language-cpp">XTKBoxBase *mBox = new XTKBox&lt;ImageType&gt;( vtkInput );
    ImageType* itkImage = mBox-&gt;getITKFromVTKImage();
</code></pre>
<p>(Klar ich kann oben direkt eine XTKBox anlegen, aber die will ich eigentlich in der Vaterklasse des Filters anlegen, obiges ist nur zum Testzweck)</p>
<p>Und meine schöne Box Klasse sieht jetzt so aus:</p>
<pre><code class="language-cpp">#ifndef XTK_BOX
#define XTK_BOX

class XTKBoxBase {
    private:
	vtkImageData*	vtkImage;

    public:
	XTKBoxBase();
	XTKBoxBase(vtkImageData* input) { vtkImage = input; }
	//set vtkImageData
	void setVTKImage(vtkImageData* input) { vtkImage = input; }
	//two ways of getting a vtkImageData
	vtkImageData* getVTKImage() { return vtkImage; }
	virtual vtkImageData* getVTKFromITKImage() = 0;
};

template &lt;typename ImageType&gt;
class XTKBox : public XTKBoxBase {
    private:
	typedef itk::VTKImageImport&lt;ImageType&gt; ImageImportType;
	typedef itk::VTKImageExport&lt;ImageType&gt; ImageExportType;
	typename ImageImportType::Pointer	itkImporter;
	typename ImageExportType::Pointer	itkExporter;

	vtkImageImport*		vtkImporter;
	vtkImageExport*		vtkExporter;

	ImageType*	itkImage;
    public:
	XTKBox() {};
	XTKBox(vtkImageData*);

	ImageType* 		getITKFromVTKImage();	//will be called by custom filter
	virtual vtkImageData* 	getVTKFromITKImage();

	void setITKImage( ImageType* );
};
#endif
</code></pre>
<p>Sieht so aus als ob ich spezifische Kindfunktionen nicht einfach so aufrufen kann, selbst wenn ich der Base Instanz sage welche spezifische Kindklasse sie werden soll. Es sei denn ich definiere die Methode in der Base Klasse als virtual und überschreibe sie.</p>
<p>HAAHAAAHAAAA :p Ich lach mich tot!</p>
<p>Ich kann das vergessen oder? Naja, wenigstens ist jetzt alles aufgeräumter und - okay - dann muss eben jede Filterversion seinen eigenen Konvertierungscode mitschleppen...</p>
<p>Vielen Dank für die Hilfe, hab zumindest einiges dazugelernt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858599</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sat, 20 Feb 2010 13:30:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 13:49:33 GMT]]></title><description><![CDATA[<p>quaid schrieb:</p>
<blockquote>
<p>Das sieht prinzipiell sehr gut aus, aber irgendwie schnaggelt mein Compiler da immernoch was nicht:</p>
</blockquote>
<p>Du hast auch einmal <code>getITKFromVTKImage()</code> und einmal <code>getVTKFromITKImage()</code> . Das ist das Problem mit kryptischen Bezeichnern. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>quaid schrieb:</p>
<blockquote>
<p>Ich kann das vergessen oder? Naja, wenigstens ist jetzt alles aufgeräumter und - okay - dann muss eben jede Filterversion seinen eigenen Konvertierungscode mitschleppen...</p>
</blockquote>
<p>Ich verstehe nicht ganz was du meinst. Wo genau hast du jetzt noch eine Codeduplizierung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858613</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 20 Feb 2010 13:49:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 13:58:34 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich bin der meinung das Nexus den richtigen ansatz hat.<br />
Ich habe das so gelöst, dass ich noch den typ als unique ID als privatemember und eine cast routine in der (polymorphen) typenklasse mitschleppe.<br />
Das ist dann zwar mehr code, lohnt sich aber da dies dann auch dynamisch zur laufzeit genutzt werden kann.</p>
<p>Sei gegrüßt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858618</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Sat, 20 Feb 2010 13:58:34 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 14:56:38 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Danke für die Antworten. Das ITKFromVTK und andersrum ist schon richtig so, die Funktion die er nicht findet ist ja auch in der Kindklasse definiert. Ein Freund von mir meinte jetzt, sowas geht dann nur mit einem dynamic_cast, das werd ich jetzt mal testen, bzw. erstmal verstehen was das ist.<br />
Es geht ja prinzipiell darum, das eine Instanz der BaseKlasse Stellvertreter einer Childklasse wird und dann eine Funktion aufrufen soll, die NUR in der Childklasse definiert wurde.</p>
<p>Jaja, und ich wollte nur mal eben einen schönen praktischen Basisfilter zum ableiten schreiben und jetzt lern ich hier noch alle Kniffe der C++ Programmierung... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858665</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sat, 20 Feb 2010 14:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 15:04:43 GMT]]></title><description><![CDATA[<p>quaid schrieb:</p>
<blockquote>
<p>Ein Freund von mir meinte jetzt, sowas geht dann nur mit einem dynamic_cast, das werd ich jetzt mal testen, bzw. erstmal verstehen was das ist.</p>
</blockquote>
<p><code>dynamic_cast</code> ist zu vermeiden wo möglich. <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-261272-and-start-is-10.html" rel="nofollow">Vor kurzem</a> habe ich dagegen argumentiert.</p>
<p>quaid schrieb:</p>
<blockquote>
<p>Es geht ja prinzipiell darum, das eine Instanz der BaseKlasse Stellvertreter einer Childklasse wird und dann eine Funktion aufrufen soll, die NUR in der Childklasse definiert wurde.</p>
</blockquote>
<p>Hier steckt auch der Designfehler. Sowas kann man fast immer anders lösen, sodass diese Notwendigkeit gar nicht erst auftritt. Gibt es bei dir keine Möglichkeit, ein entsprechendes Interface (rein virtuelle Funktionen) in der Basisklasse einzurichten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858679</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 20 Feb 2010 15:04:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 15:44:10 GMT]]></title><description><![CDATA[<p>Das erfassen des ImageTypes ist leider nicht wegzukapseln, geht einfach nicht.</p>
<p>Dynamic_Cast würde mir doch helfen, zumindest würde mir das vom Design her schon gefallen. Aber ich hab ja jetzt meine XTKBox&lt;ImageType&gt;, damit ist dann zumindest der ganze Konvertierungskram schön in einer separaten Template-Klasse weggekapselt.</p>
<p>Leidet denn die Performance so sehr, wenn ich einmal dynamic-caste ??</p>
<p>Kann natürlich trotzdem sein, dass ich da einen Denkfehler habe, wer weiß. Jedenfalls kann ich mich jetzt nicht mehr damit aufhalten da ich noch sehr viel anderes zu programmieren habe und dann auch irgendwann mal fertig werden wollte.</p>
<p>Viele Dank nochmal an alle!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858705</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sat, 20 Feb 2010 15:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 15:57:18 GMT]]></title><description><![CDATA[<p>quaid schrieb:</p>
<blockquote>
<p>Leidet denn die Performance so sehr, wenn ich einmal dynamic-caste ??</p>
</blockquote>
<p>Das ist nicht das Hauptproblem (auch wenn gängige <code>dynamic_cast</code> -Implementierungen nicht besonders schnell sind). Falls es dich interessiert: In meinem Link steht eine Begründung.</p>
<p>quaid schrieb:</p>
<blockquote>
<p>Kann natürlich trotzdem sein, dass ich da einen Denkfehler habe, wer weiß. Jedenfalls kann ich mich jetzt nicht mehr damit aufhalten da ich noch sehr viel anderes zu programmieren habe und dann auch irgendwann mal fertig werden wollte.</p>
</blockquote>
<p>Leider hat das Design oft unter Zeitdruck zu leiden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Es ist ja nicht wahnsinnig tragisch, das einmal zu tun. Ich kenne dein Design auch zu wenig, um da konkrete Verbesserungsvorschläge zu bringen. Wichtig ist einfach, dass du dir Typ-Abfragen und dynamische Downcasts auf keinen Fall angewöhnst und als Standard-Herangehensweise verwendest. Es besteht nämlich nicht nur ein theoretisches Problem (&quot;nicht sehr sauberes Design&quot;), sondern kann tatsächlich einige Schwierigkeiten mit sich bringen, siehe Link.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858711</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 20 Feb 2010 15:57:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 16:58:24 GMT]]></title><description><![CDATA[<p>Ich geh kaputt. :p Meine Template Klasse xvtkBox ist ja schön weggekapselt als eigene xvtkBox.h und xvtkBox.cxx. Doll doll. Bis auf dass der Compiler dann natürlich mal glatte 0 Varianten der Klasse erzeugt, jeweils eine für jeden zur Compilezeit bekannten ImageType... Der Linker streikt dann natürlich, weil es keinen passenden Konstruktor für meinen ImageType gibt.</p>
<p>Die ImageTypes sind immer von dieser Art:</p>
<pre><code>itk::Image&lt; itk::vector&lt;double, x&gt;, y &gt;
</code></pre>
<p>Für jede Dimension y, Anzahl Komponenten x (bei RGB z.B. 3) und 12 Skalartypen. Da kommt man auf 3*3*12 = 108 Varianten.</p>
<p>Soll ich die jetzt alle als Spezialisierung da mit reinschreiben??!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858734</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sat, 20 Feb 2010 16:58:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sat, 20 Feb 2010 21:57:29 GMT]]></title><description><![CDATA[<p>quaid schrieb:</p>
<blockquote>
<p>Soll ich die jetzt alle als Spezialisierung da mit reinschreiben??!</p>
</blockquote>
<p>Ja, für das sind Spezialisierungen schliesslich da. 108 geht ja noch, du hättest es schlimmer treffen können.</p>
<p>Natürlich nicht. :p<br />
Bei solch massiver Codeduplizierung gibts immer einen besseren Weg (und wenns im Notfall Präprozessor-Metaprogrammierung ist). Bei dir glaube ich aber, lässt sich mit Template-Metaprogrammierung einiges machen. Wahrscheinlich unter Einsatz von Typlisten. Das ist aber nicht ganz trivial... Kennst du zufällig das Buch &quot;Modern C++ Design&quot;?</p>
<p>Aber wie sieht das Problem genau aus? Ich verliere langsam den Überblick. Am Anfang ging es noch darum, die Instanzen mit unterschiedlichem Templateargument polymorph anzusprechen, dann ging es um dynamisches Downcasten, und jetzt willst du Codegeneratoren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Kannst du wenn möglich ein vereinfachtes Beispiel zeigen, das keine irrelevanten Details enthält? Also dein aktuelles Problem, soweit wie möglich reduziert (und nicht mehr zu viel kryptische Bezeichner :)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858882</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 20 Feb 2010 21:57:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sun, 21 Feb 2010 10:24:01 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Also das mit dem dynamic_cast und so hat sich erledigt. Mein Programm ist jetzt etwas anders (besser) aufgebaut. Was sehr schön ist, ist dass die XTKBox jetzt den ganzen Konvertierungskram erledigt und ich ihr sagen kann &quot;Gib mir das ITK Bild / Mach aus dem VTK Bild ein ITK Bild / ...&quot;</p>
<p>Aber die Box ist halt ne Templateklasse und da sie in einer eigenen .h .cxx steht kann der Compiler natürlich nicht wissen, welcher Datentyp der ImageType denn mal werden wird. Deswegen streikt ja auch der Linker, compilieren tut das alles.<br />
Ich weiß aber, wie der Image Type aussieht, es sind eben die oben 108 beschriebenen Varianten.</p>
<p>Die existierenden Filter in ITK (mit denen ich die Bilder bearbeite, VTK ist das &quot;Visualization Toolkit&quot;) werden auch immer mit dem ImageType instanziiert, davon gibts also auch immer diese 108 Varianten:</p>
<p>So ein Filter sieht z.B: so aus:</p>
<pre><code class="language-cpp">itk::Image&lt; char, 2 &gt; ImageType; //2-dimensionales Bild, jeder Pixel als char

itk::MedianImageFilter&lt; ImageType &gt; FilterType;
FilterType myFilter = FilterType::New();
myFilter-&gt;SetInput( imageReader-&gt;GetOutput() );
...
</code></pre>
<p>Das ist immer wie eine Pipeline aufgebaut. Reader-&gt;Filter-&gt;Filter-&gt;...-&gt;Writer Und jeder Filter (Reader und Writer sind auch &quot;Filter&quot;) muss eben immer mit diesem ImageType instanziiert werden...</p>
<p>Wär echt klasse wenn ich da irgendwie meine 108 Varianten zur Compilezeit erzeugen könnte. Wär mir auch egal wie groß das Ding dann wird, immerhin ist es jetzt eine eigene schöne Klasse geworden.</p>
<p>Ich würde mir liebend gerne in aller Ruhe ein Buch darüber anschauen, aber ich fürchte dafür hab ich keine Zeit. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Hier nochmal meine fantastische XTKBox, eine XTKBoxBase gibts jetzt garnicht mehr.</p>
<pre><code class="language-cpp">#ifndef XTK_BOX
#define XTK_BOX

template &lt;typename ImageType&gt;
class XTKBox {
    protected:
	typedef itk::VTKImageImport&lt;ImageType&gt; ImageImportType;
	typedef itk::VTKImageExport&lt;ImageType&gt; ImageExportType;
	typename ImageImportType::Pointer	itkImporter;
	typename ImageExportType::Pointer	itkExporter;

	vtkImageImport*		vtkImporter;
	vtkImageExport*		vtkExporter;

	ImageType*	itkImage;
	vtkImageData*	vtkImage;
    public:
        //hier jetzt die ganzen Konvertierungsmethoden
        //...getter und setter...
};
#endif
</code></pre>
<p>Im Hauptprogramm geh ich dann hin und mache ein</p>
<pre><code class="language-cpp">XTKBox&lt;ImageType&gt; *magicBox = new XTKBox&lt;ImageType&gt;( vtkInput );
    ImageType* itkImage = magicBox-&gt;getITKFromVTKImage();
</code></pre>
<p>und schwupps hab ich auch schon aus dem VTK Bild ein ITK Bild gemacht und bin überglücklich und springe vor lauter Freude stundenlang im Dreieck. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858972</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sun, 21 Feb 2010 10:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung - Funktion von Kind aufrufen on Sun, 21 Feb 2010 17:53:26 GMT]]></title><description><![CDATA[<p>Hab mich jetzt doch mit der Template Meta-Programmierung auseinandergesetzt. Diesbezüglich hab ich ein neues Topic eröffnet.</p>
<p>Ansonsten funktioniert alles bestens! Die 108 Varianten hab ich dem Compiler beigebracht, indem ich in der XTKBox.cxx einfach mit meinen ja schon programmierten 3-Schritt Typgenerierungsfunktionen bestückt und für jeden ImageType dann eine Instanz erzeugt und alle Funktionen die es gibt davon aufgerufen (der compiliert doch glatt nur Funktionen, die auch verwendet werden! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )</p>
<p>Das ist natürlich nicht gerade die feinste Art, daher neuer Thread</p>
<p>&quot;Template Metaprogrammierung - Typvarianten erzeugen&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859196</guid><dc:creator><![CDATA[quaid]]></dc:creator><pubDate>Sun, 21 Feb 2010 17:53:26 GMT</pubDate></item></channel></rss>