<?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[Schnittstelle für Templatemethode]]></title><description><![CDATA[<p>Hallo Forum,<br />
ich habe folgendes Problem:<br />
Ich habe eine Basisklasse für einen Beobachter, der auf bestimmte entsandte Events reagiert. Dafür brauche ich eine Funktion die folgendermaßen aussehen soll.</p>
<pre><code>template &lt; typename TEvent &gt;
void handleEvent (TEvent&amp; event);
</code></pre>
<p>Diese Funktion muss von den erbenden Klassen natürlich auf irgendeine Weise implementiert werden.<br />
Da ich aber eine Templatefunktion nicht als virtuell deklarieren kann und auch die Funktion nicht in den abgeleiteten Klassen spezialisieren kann, muss eine andere Lösung her.<br />
Natürlich könnte ich auch einfach ein Interface für die Events nehmen und einen Basisklassenzeiger an &quot;handleEvent&quot; übergeben. Das ist aber nicht Sinn der Sache. Mich interessiert ob es auch eine andere Möglichkeit gibt etwas in der Art und Weise zu implementieren.</p>
<p>Danke schon einmal im Voraus ! <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>
<p>EDIT : Vielleicht sollte ich noch erwähnen, dass die Basisklasse des Beobachters eine zur Kompilierzeit bekannte Liste von denjenigen Events hat, auf die er reagieren soll.</p>
<pre><code>template &lt; typename... TTypes &gt;
class Typelist;
</code></pre>
<pre><code>template &lt; typename TEventlist &gt;
class ObserverInterface
{
    public:
        using Eventlist = TEventlist; // e.g Typelist&lt;EventOne, EventTwo, EventThree&gt;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/339925/schnittstelle-für-templatemethode</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 13:54:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339925.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Oct 2016 15:21:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schnittstelle für Templatemethode on Sat, 08 Oct 2016 15:33:14 GMT]]></title><description><![CDATA[<p>Hallo Forum,<br />
ich habe folgendes Problem:<br />
Ich habe eine Basisklasse für einen Beobachter, der auf bestimmte entsandte Events reagiert. Dafür brauche ich eine Funktion die folgendermaßen aussehen soll.</p>
<pre><code>template &lt; typename TEvent &gt;
void handleEvent (TEvent&amp; event);
</code></pre>
<p>Diese Funktion muss von den erbenden Klassen natürlich auf irgendeine Weise implementiert werden.<br />
Da ich aber eine Templatefunktion nicht als virtuell deklarieren kann und auch die Funktion nicht in den abgeleiteten Klassen spezialisieren kann, muss eine andere Lösung her.<br />
Natürlich könnte ich auch einfach ein Interface für die Events nehmen und einen Basisklassenzeiger an &quot;handleEvent&quot; übergeben. Das ist aber nicht Sinn der Sache. Mich interessiert ob es auch eine andere Möglichkeit gibt etwas in der Art und Weise zu implementieren.</p>
<p>Danke schon einmal im Voraus ! <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>
<p>EDIT : Vielleicht sollte ich noch erwähnen, dass die Basisklasse des Beobachters eine zur Kompilierzeit bekannte Liste von denjenigen Events hat, auf die er reagieren soll.</p>
<pre><code>template &lt; typename... TTypes &gt;
class Typelist;
</code></pre>
<pre><code>template &lt; typename TEventlist &gt;
class ObserverInterface
{
    public:
        using Eventlist = TEventlist; // e.g Typelist&lt;EventOne, EventTwo, EventThree&gt;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2510965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510965</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Sat, 08 Oct 2016 15:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to Schnittstelle für Templatemethode on Sun, 09 Oct 2016 01:13:29 GMT]]></title><description><![CDATA[<p>Auf folgende Art und Weise scheint es zu funktionieren <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>
<pre><code>template &lt; typename... TTypes &gt;
class TypeList;

namespace impl
{
	template &lt; template&lt;typename...&gt; typename List, typename T &gt;
	struct RenameImpl;

	template &lt; template&lt;typename...&gt; typename List, template&lt;typename...&gt; typename T, typename... Ts &gt;
	struct RenameImpl&lt;List, T&lt;Ts...&gt;&gt;
	{
		using Type = List&lt;Ts...&gt;;
	};
} 

template &lt; template&lt;typename...&gt; typename List, typename T &gt;
using RenameType = typename impl::RenameImpl&lt;List, T&gt;::Type;

template &lt; typename TEventList &gt;
class EventDispatcher
{
public:
	template &lt; typename TEvent &gt;
	void operator()(TEvent&amp; event)
	{
		std::get&lt;std::function&lt;void(TEvent&amp;)&gt;&gt;(dispatchTable_)(event);
	}

	template &lt; typename TEvent, typename TFunction &gt;
	void addDispatch(TFunction&amp;&amp; function)
	{
		std::get&lt;std::function&lt;void(TEvent&amp;)&gt;&gt;(dispatchTable_) = std::forward&lt;TFunction&gt;(function);
	}
private:
	template &lt; typename... TEventList &gt;
	using DispatchTable = std::tuple&lt;std::function&lt;void(TEventList&amp;)&gt;...&gt;;

	RenameType&lt;DispatchTable, TEventList&gt; dispatchTable_;
};

struct EventOne{};
struct EventTwo{};
struct EventThree{};

using EventList = TypeList&lt;EventOne, EventTwo, EventThree&gt;;

int main()
{
	EventDispatcher&lt;EventList&gt; ed;

	ed.addDispatch&lt;EventOne&gt;([](EventOne event) { std::cout &lt;&lt; &quot;EventOne!\n&quot;; });
	ed.addDispatch&lt;EventTwo&gt;([](EventTwo event) { std::cout &lt;&lt; &quot;EventTwo!\n&quot;; });
	ed.addDispatch&lt;EventThree&gt;([](EventThree event) { std::cout &lt;&lt; &quot;EventThree!\n&quot;; });

	EventTwo two;

	ed(two);

	std::getchar();

	return 0;
}
</code></pre>
<p>[OUTPUT] EventTwo!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511014</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Sun, 09 Oct 2016 01:13:29 GMT</pubDate></item></channel></rss>