<?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[Problem mit Template Spezialisierung]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe Probleme mit der Template Spezialisierung.<br />
Ich würde mich freuen, wenn Ihr auf das folgende, möglichst einfach gehaltene<br />
Problem einen Blick werfen würdet.</p>
<pre><code class="language-cpp">/*
Ich habe eine Template Basisklasse Base, die eine pure virtual Funktion fun()
bereitstellt. Der Templateparameter soll mit den Basistypen wie
bool, float, int, char, usw. instanziiert werden.
*/
template &lt;typename T&gt;
class Base {
	virtual ~Base() {}
	virtual void fun(T v) = 0;
};
/*
Von dieser Basisklasse base werden eine Reihe von weiteren Klassen abgeleitet,
eine von ihnen ist Derived_1.
In Derived_1 sollen einige Funktionen wie auch die virtuelle Funktion fun()
unterschiedliche Implementierungen für Gleitkomma- und Integerzahlen haben.
Hierzu habe ich eine Klasse TypeInfo erstellt, die über ein statisches Feld
die entsprechende Art des Typs zurückliefert.
*/
typedef enum TypeKind {
	FLOATING_TYPE,
	INTEGRAL_TYPE,
} TypeKind_t;

#include &lt;limits&gt;
template &lt;typename T&gt;
class TypeInfo {
	static const TypeKind_t typeKind =
		std::numeric_limits&lt;T&gt;::is_integer ? INTEGRAL_TYPE
		                                   : FLOATING_TYPE;
};
/*
Nun zu dem eigentlichen Problem:
Wie schreibe ich nun am besten unterschiedliche Implementierungen von fun() für
die verschiedenen Typarten.

Ich habe an folgende Möglichkeiten gedacht, von denen jedoch keine mit g++ 4.xx
kompiliert:

a) Verwendung einer Template Funktion:
*/
template &lt;typename T&gt;
class Derived_1a : public Base&lt;T&gt; {
	template &lt;TypeKind_t kind&gt; void fun(T v);
	void fun(T v);
};

template &lt;typename T&gt;
template &lt;&gt;
void Derived_1a&lt;T&gt;::fun&lt;FLOATING_TYPE&gt;(T v) {
	// ...
}

template &lt;typename T&gt;
void Derived_1a&lt;T&gt;::fun(T v) {
	fun&lt;TypeInfo::is_integer&lt;T&gt; &gt;(v);
}

/*
b) Verwendung einer eingebetteten Hilfsklasse:
*/
template &lt;typename T&gt;
class Derived_1b : public Base&lt;T&gt; {
	template &lt;TypeKind_t kind&gt;
	class TypeDep {
		void fun(T v);
	} typeDep&lt;TypeInfo::typeKind&lt;T&gt; &gt;;

	void fun(T v);
};

template &lt;typename T&gt;
template &lt;&gt;
void Derived_1b&lt;T&gt;::TypeDep&lt;FLOATING_TYPE&gt;::fun(T v) {
	// ...
}

template &lt;typename T&gt;
void Derived_1b&lt;T&gt;::fun(T v) {
	typeDep.fun(v);
}
</code></pre>
<p>Ich hoffe ich konnte das Problem verständlich darstellen.<br />
Ich würde mich sehr über Eure Hilfe freuen.</p>
<p>Vielen Dank, Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208638/problem-mit-template-spezialisierung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 20:38:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208638.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Mar 2008 15:15:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Template Spezialisierung on Thu, 20 Mar 2008 16:05:13 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe Probleme mit der Template Spezialisierung.<br />
Ich würde mich freuen, wenn Ihr auf das folgende, möglichst einfach gehaltene<br />
Problem einen Blick werfen würdet.</p>
<pre><code class="language-cpp">/*
Ich habe eine Template Basisklasse Base, die eine pure virtual Funktion fun()
bereitstellt. Der Templateparameter soll mit den Basistypen wie
bool, float, int, char, usw. instanziiert werden.
*/
template &lt;typename T&gt;
class Base {
	virtual ~Base() {}
	virtual void fun(T v) = 0;
};
/*
Von dieser Basisklasse base werden eine Reihe von weiteren Klassen abgeleitet,
eine von ihnen ist Derived_1.
In Derived_1 sollen einige Funktionen wie auch die virtuelle Funktion fun()
unterschiedliche Implementierungen für Gleitkomma- und Integerzahlen haben.
Hierzu habe ich eine Klasse TypeInfo erstellt, die über ein statisches Feld
die entsprechende Art des Typs zurückliefert.
*/
typedef enum TypeKind {
	FLOATING_TYPE,
	INTEGRAL_TYPE,
} TypeKind_t;

#include &lt;limits&gt;
template &lt;typename T&gt;
class TypeInfo {
	static const TypeKind_t typeKind =
		std::numeric_limits&lt;T&gt;::is_integer ? INTEGRAL_TYPE
		                                   : FLOATING_TYPE;
};
/*
Nun zu dem eigentlichen Problem:
Wie schreibe ich nun am besten unterschiedliche Implementierungen von fun() für
die verschiedenen Typarten.

Ich habe an folgende Möglichkeiten gedacht, von denen jedoch keine mit g++ 4.xx
kompiliert:

a) Verwendung einer Template Funktion:
*/
template &lt;typename T&gt;
class Derived_1a : public Base&lt;T&gt; {
	template &lt;TypeKind_t kind&gt; void fun(T v);
	void fun(T v);
};

template &lt;typename T&gt;
template &lt;&gt;
void Derived_1a&lt;T&gt;::fun&lt;FLOATING_TYPE&gt;(T v) {
	// ...
}

template &lt;typename T&gt;
void Derived_1a&lt;T&gt;::fun(T v) {
	fun&lt;TypeInfo::is_integer&lt;T&gt; &gt;(v);
}

/*
b) Verwendung einer eingebetteten Hilfsklasse:
*/
template &lt;typename T&gt;
class Derived_1b : public Base&lt;T&gt; {
	template &lt;TypeKind_t kind&gt;
	class TypeDep {
		void fun(T v);
	} typeDep&lt;TypeInfo::typeKind&lt;T&gt; &gt;;

	void fun(T v);
};

template &lt;typename T&gt;
template &lt;&gt;
void Derived_1b&lt;T&gt;::TypeDep&lt;FLOATING_TYPE&gt;::fun(T v) {
	// ...
}

template &lt;typename T&gt;
void Derived_1b&lt;T&gt;::fun(T v) {
	typeDep.fun(v);
}
</code></pre>
<p>Ich hoffe ich konnte das Problem verständlich darstellen.<br />
Ich würde mich sehr über Eure Hilfe freuen.</p>
<p>Vielen Dank, Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477867</guid><dc:creator><![CDATA[Hindman]]></dc:creator><pubDate>Thu, 20 Mar 2008 16:05:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template Spezialisierung on Thu, 20 Mar 2008 15:54:43 GMT]]></title><description><![CDATA[<p>erst mal muss du dann Derived_1a von Base ableiten.<br />
Wenn die einzelnen abgeleiteten Klassen unterschiedliche Implementierungen<br />
haben dann mußt du die entsprechende nur instanziieren. Dann kannst du<br />
auch gleich virtual void fun() schreiben ohne den Typ T.</p>
<p>Wenn ich das richtig verstanden habe. Es könnten also auch 2 oder mehr unterschiedliche Implementierungen für double geben???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477892</guid><dc:creator><![CDATA[schokomann]]></dc:creator><pubDate>Thu, 20 Mar 2008 15:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template Spezialisierung on Thu, 20 Mar 2008 16:02:44 GMT]]></title><description><![CDATA[<p>schokomann schrieb:</p>
<blockquote>
<p>erst mal muss du dann Derived_1a von Base ableiten.<br />
Wenn die einzelnen abgeleiteten Klassen unterschiedliche Implementierungen<br />
haben dann mußt du die entsprechende nur instanziieren.</p>
</blockquote>
<p>Ach Mist, so meinte ich das auch. Ich habs geändert.</p>
<blockquote>
<p>Dann kannst du auch gleich virtual void fun() schreiben ohne den Typ T.</p>
<p>Wenn ich das richtig verstanden habe. Es könnten also auch 2 oder mehr unterschiedliche Implementierungen für double geben???</p>
</blockquote>
<p>Es gibt halt 15 verschiedene Basisdatentypen, die ich nicht alle einzelnd spezialisieren wollte. Deswegen hat dieser Template-Meta-Programming Umweg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477896</guid><dc:creator><![CDATA[Hindman]]></dc:creator><pubDate>Thu, 20 Mar 2008 16:02:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template Spezialisierung on Thu, 20 Mar 2008 16:06:11 GMT]]></title><description><![CDATA[<p>dann brauchst du aber nur ein template. Da stopft man seine Typen rein.<br />
Dafür ist ein Template ja da. Wenn dann z.B. die Ausgabe hinsichtlich der<br />
Genauigkeit oder der Formatierung anders sein soll, dann würde ich das über Parameter machen, die ich einstellen kann oder intelligente Funktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477899</guid><dc:creator><![CDATA[schokomann]]></dc:creator><pubDate>Thu, 20 Mar 2008 16:06:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template Spezialisierung on Thu, 20 Mar 2008 16:16:59 GMT]]></title><description><![CDATA[<p>schokomann schrieb:</p>
<blockquote>
<p>dann brauchst du aber nur ein template. Da stopft man seine Typen rein.<br />
Dafür ist ein Template ja da. Wenn dann z.B. die Ausgabe hinsichtlich der<br />
Genauigkeit oder der Formatierung anders sein soll, dann würde ich das über Parameter machen, die ich einstellen kann oder intelligente Funktionen.</p>
</blockquote>
<p>Nein, Parameter sind keine Option für mich, da das das Interface verschandelt. Außerdem ist es sinnvoll nur den Code zu generieren, der auch tatsächlich benötigt wird. Einige Funktionen gibt es für die jeweils andere Datentyp-Art auch gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477909</guid><dc:creator><![CDATA[Hindman]]></dc:creator><pubDate>Thu, 20 Mar 2008 16:16:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template Spezialisierung on Thu, 20 Mar 2008 16:44:19 GMT]]></title><description><![CDATA[<p>Ich denke ich hab eine gute Lösung gefunden.</p>
<pre><code class="language-cpp">#include &lt;limits&gt;
#include &lt;iostream&gt;

using namespace std;

typedef enum TypeKind {
	FLOATING_TYPE,
	INTEGRAL_TYPE,
} TypeKind_t;

template &lt;typename T&gt;
class TypeInfo {
public:
	static const TypeKind_t typeKind =
		std::numeric_limits&lt;T&gt;::is_integer ? INTEGRAL_TYPE
		                                   : FLOATING_TYPE;
};

// ************************************************************************** //

template &lt;typename T&gt;
class Base {
public:
	virtual ~Base() {}
	virtual void fun(T v) = 0;
};

// ************************************************************************** //

template &lt;typename T, TypeKind TK&gt;
class DerivedTypeDependant : public Base&lt;T&gt; {
public:
	void fun(T v);
};

template &lt;typename T&gt;
class DerivedTypeDependant&lt;T, FLOATING_TYPE&gt; {
public:
	void fun(T v) {
		cout &lt;&lt; &quot;floating version: &quot; &lt;&lt; v &lt;&lt; endl;
	};
};

template &lt;typename T&gt;
class DerivedTypeDependant&lt;T, INTEGRAL_TYPE&gt; {
public:
	void fun(T v) {
		cout &lt;&lt; &quot;integral version: &quot; &lt;&lt; v &lt;&lt; endl;
	};
};

// ************************************************************************** //

template &lt;typename T&gt;
class Derived : public DerivedTypeDependant&lt;T, TypeInfo&lt;T&gt;::typeKind &gt; {
};

// ************************************************************************** //

int main() {
	Derived&lt;float&gt; fo;
	fo.fun(4.4);
	Derived&lt;int&gt; io;
	io.fun(4);
}
</code></pre>
<p>Danke für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477920</guid><dc:creator><![CDATA[Hindman]]></dc:creator><pubDate>Thu, 20 Mar 2008 16:44:19 GMT</pubDate></item></channel></rss>