<?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[Multimethoden in C++]]></title><description><![CDATA[<p>Hallo Forum,<br />
ich habe mich mal daran versucht Multimethoden in C++ zu simulieren. Hier ist mein bisheriger Fortschritt mit Kommentaren im Quellcode.</p>
<pre><code>template &lt; typename TReturnType, typename TType &gt; // momentan nur ein Parameter für die Multimethode
class Dispatch
{
public:
	template &lt; typename TFunction &gt;
	void setDispatch(TFunction&amp;&amp; fn) noexcept // definiert die Funktion für dieses Dispatch
	{
		dispatch_ = fn;
	}

	decltype(auto) dispatch()
	{
		if (dispatch_ != nullptr)
		{
			return std::forward&lt;std::function&lt;TReturnType(TType)&gt;&gt;(dispatch_); // gibt eine rValue-Referenz der Funktion zurück
		} 
		throw std::exception(&quot;&quot;); // ruft std::terminate in operator() von class MultipleDispatch auf, wenn Funktion nicht definiert ist!
	}
private:
	std::function&lt;TReturnType(TType)&gt; dispatch_; // Funktionwrapper, der auf nullptr zeigt, solange er nicht explizit einem Ziel zugewiesen wird
};
</code></pre>
<pre><code>template &lt; typename TReturnType, typename... TTypes &gt; // Die eigentliche &quot;Multimethode&quot; in Form eines Funktors
class MultipleDispatch
{
public:
	template &lt; typename TType, typename TFunction &gt;
	void setDispatch(TFunction&amp;&amp; fn) noexcept
	{
		std::get&lt;Dispatch&lt;TReturnType, TType&gt;&gt;(dispatchTable_).setDispatch(std::forward&lt;TFunction&gt;(fn));
	}

	template &lt; typename TType &gt;
	TReturnType operator()(TType value) noexcept // überladener () Operator, um der Syntax eines Funktionsaufrufes zu ähneln ( Funktor )
	{
		return std::get&lt;Dispatch&lt;TReturnType, TType&gt;&gt;(dispatchTable_).dispatch()(value);
	}

private:
	std::tuple&lt;Dispatch&lt;TReturnType, TTypes&gt;...&gt; dispatchTable_; // ein TUple das alle Variationen des Funktors enthält
};
</code></pre>
<pre><code>// Beispiel zur Anwendung

template &lt; typename... TTypes &gt;
class Base
{
public:
	virtual ~Base() {}
public:
	MultipleDispatch&lt;void, TTypes...&gt; foo; // Instanz des Funktors mit den gewünschten Typen
};

class Derived
	: public Base&lt;int, float&gt;
{
public:
	Derived()
	{
		// Hier werden die einzelnen Variation der Funktion definiert, je nach Typ des Templateparameters
		foo.setDispatch&lt;int&gt;([this](int x) { std::cout &lt;&lt; x &lt;&lt; &quot;\n&quot;; }); // über this-Capture kann die Lambdafunktion auf die Member von Derived zugreifen !
		foo.setDispatch&lt;float&gt;([this](float x) { std::cout &lt;&lt; x * 2 &lt;&lt; &quot;\n&quot;; });
	}
};

int main()
{
	Base&lt;int, float&gt;* b = new Derived();
	Derived d;

	b-&gt;foo(5); // 5
	b-&gt;foo(5.f); // 10
	d.foo(10); // 10 
	d.foo(10.f); // 20
	/*d.foo(10.5);*/ // Compiletime error

	delete b;

	std::getchar();

	return 0;
}
</code></pre>
<p>Wie findet ihr den Ansatz ? Mein nächstes Ziel ist es, Funktionen mit mehreren Parametern zu ermöglichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339992/multimethoden-in-c</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 16:56:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339992.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Oct 2016 16:34:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multimethoden in C++ on Wed, 12 Oct 2016 16:34:41 GMT]]></title><description><![CDATA[<p>Hallo Forum,<br />
ich habe mich mal daran versucht Multimethoden in C++ zu simulieren. Hier ist mein bisheriger Fortschritt mit Kommentaren im Quellcode.</p>
<pre><code>template &lt; typename TReturnType, typename TType &gt; // momentan nur ein Parameter für die Multimethode
class Dispatch
{
public:
	template &lt; typename TFunction &gt;
	void setDispatch(TFunction&amp;&amp; fn) noexcept // definiert die Funktion für dieses Dispatch
	{
		dispatch_ = fn;
	}

	decltype(auto) dispatch()
	{
		if (dispatch_ != nullptr)
		{
			return std::forward&lt;std::function&lt;TReturnType(TType)&gt;&gt;(dispatch_); // gibt eine rValue-Referenz der Funktion zurück
		} 
		throw std::exception(&quot;&quot;); // ruft std::terminate in operator() von class MultipleDispatch auf, wenn Funktion nicht definiert ist!
	}
private:
	std::function&lt;TReturnType(TType)&gt; dispatch_; // Funktionwrapper, der auf nullptr zeigt, solange er nicht explizit einem Ziel zugewiesen wird
};
</code></pre>
<pre><code>template &lt; typename TReturnType, typename... TTypes &gt; // Die eigentliche &quot;Multimethode&quot; in Form eines Funktors
class MultipleDispatch
{
public:
	template &lt; typename TType, typename TFunction &gt;
	void setDispatch(TFunction&amp;&amp; fn) noexcept
	{
		std::get&lt;Dispatch&lt;TReturnType, TType&gt;&gt;(dispatchTable_).setDispatch(std::forward&lt;TFunction&gt;(fn));
	}

	template &lt; typename TType &gt;
	TReturnType operator()(TType value) noexcept // überladener () Operator, um der Syntax eines Funktionsaufrufes zu ähneln ( Funktor )
	{
		return std::get&lt;Dispatch&lt;TReturnType, TType&gt;&gt;(dispatchTable_).dispatch()(value);
	}

private:
	std::tuple&lt;Dispatch&lt;TReturnType, TTypes&gt;...&gt; dispatchTable_; // ein TUple das alle Variationen des Funktors enthält
};
</code></pre>
<pre><code>// Beispiel zur Anwendung

template &lt; typename... TTypes &gt;
class Base
{
public:
	virtual ~Base() {}
public:
	MultipleDispatch&lt;void, TTypes...&gt; foo; // Instanz des Funktors mit den gewünschten Typen
};

class Derived
	: public Base&lt;int, float&gt;
{
public:
	Derived()
	{
		// Hier werden die einzelnen Variation der Funktion definiert, je nach Typ des Templateparameters
		foo.setDispatch&lt;int&gt;([this](int x) { std::cout &lt;&lt; x &lt;&lt; &quot;\n&quot;; }); // über this-Capture kann die Lambdafunktion auf die Member von Derived zugreifen !
		foo.setDispatch&lt;float&gt;([this](float x) { std::cout &lt;&lt; x * 2 &lt;&lt; &quot;\n&quot;; });
	}
};

int main()
{
	Base&lt;int, float&gt;* b = new Derived();
	Derived d;

	b-&gt;foo(5); // 5
	b-&gt;foo(5.f); // 10
	d.foo(10); // 10 
	d.foo(10.f); // 20
	/*d.foo(10.5);*/ // Compiletime error

	delete b;

	std::getchar();

	return 0;
}
</code></pre>
<p>Wie findet ihr den Ansatz ? Mein nächstes Ziel ist es, Funktionen mit mehreren Parametern zu ermöglichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511369</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Wed, 12 Oct 2016 16:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Multimethoden in C++ on Wed, 12 Oct 2016 19:07:21 GMT]]></title><description><![CDATA[<p>Irgendwie seh ich grad nicht, warum das jetzt Multimethoden sein sollten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511380</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 12 Oct 2016 19:07:21 GMT</pubDate></item><item><title><![CDATA[Reply to Multimethoden in C++ on Wed, 12 Oct 2016 20:16:46 GMT]]></title><description><![CDATA[<p>hm kanns sein, dass ich den falschen Begriff für mein Problem gegoogelt hab ? <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="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511386</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Wed, 12 Oct 2016 20:16:46 GMT</pubDate></item></channel></rss>