<?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 frage]]></title><description><![CDATA[<p>Hey,</p>
<p>ich habe eine Klasse <em>basic_socket</em>, die als Member einen Socket-Deskriptor hat und diesen mit <em>socket()</em> im Konstruktor initialisiere.</p>
<p>Da ich sowohl TCP-, als auch UDP-Sockets erstellen können möchte muss dem Konstruktor momentan noch ein Parameter übergeben werden anhand dessen dann in <em>socket()</em> entweder <em>SOCK_STREAM</em> oder <em>SOCK_DGRAM</em> übergeben wird.</p>
<p>Das würde ich gerne eleganter mit Templates lösen. Also z.B. <em>basic_socket&lt;TCP&gt;</em>.</p>
<p>Wie mache ich das am besten? Ich bräuchte ja theoretisch noch 2 extra Klassen als Typen - das wäre aber wieder zusätzlicher Overhead. Ist das überhaupt praktikabel, oder soll ich die Übergabe als Parameter beibehalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323354/template-frage</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 03:42:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323354.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Jan 2014 12:35:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template frage on Mon, 27 Jan 2014 12:35:25 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>ich habe eine Klasse <em>basic_socket</em>, die als Member einen Socket-Deskriptor hat und diesen mit <em>socket()</em> im Konstruktor initialisiere.</p>
<p>Da ich sowohl TCP-, als auch UDP-Sockets erstellen können möchte muss dem Konstruktor momentan noch ein Parameter übergeben werden anhand dessen dann in <em>socket()</em> entweder <em>SOCK_STREAM</em> oder <em>SOCK_DGRAM</em> übergeben wird.</p>
<p>Das würde ich gerne eleganter mit Templates lösen. Also z.B. <em>basic_socket&lt;TCP&gt;</em>.</p>
<p>Wie mache ich das am besten? Ich bräuchte ja theoretisch noch 2 extra Klassen als Typen - das wäre aber wieder zusätzlicher Overhead. Ist das überhaupt praktikabel, oder soll ich die Übergabe als Parameter beibehalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379879</guid><dc:creator><![CDATA[template_nooob]]></dc:creator><pubDate>Mon, 27 Jan 2014 12:35:25 GMT</pubDate></item><item><title><![CDATA[Reply to template frage on Mon, 27 Jan 2014 12:44:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich bräuchte ja theoretisch noch 2 extra Klassen als Typen</p>
</blockquote>
<p>Da nutzt man eher eine Enumeration.</p>
<p>Wenn die Information zur Compile-Zeit bekannt ist, nimmst du natürlich Templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379880</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 27 Jan 2014 12:44:30 GMT</pubDate></item><item><title><![CDATA[Reply to template frage on Mon, 27 Jan 2014 12:46:08 GMT]]></title><description><![CDATA[<p>template_nooob schrieb:</p>
<blockquote>
<p>Ich bräuchte ja theoretisch noch 2 extra Klassen als Typen - das wäre aber wieder zusätzlicher Overhead.</p>
</blockquote>
<p>Overhead? Du meinst 1-2 Mikrosekunden mehr Compilezeit?</p>
<p>Was du hier vor hast, ist eine stark abgespeckte Version von:<br />
<a href="http://en.wikipedia.org/wiki/Policy-based_design" rel="nofollow">http://en.wikipedia.org/wiki/Policy-based_design</a></p>
<p>Oder einfacher:</p>
<pre><code>template &lt;int socket_type&gt; class basic_socket { ... };
typedef basic_socket&lt;SOCK_STREAM&gt; TCP_socket;
typedef basic_socket&lt;SOCK_DGRAM&gt; UDP_socket;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2379881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379881</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 27 Jan 2014 12:46:08 GMT</pubDate></item><item><title><![CDATA[Reply to template frage on Mon, 27 Jan 2014 12:58:33 GMT]]></title><description><![CDATA[<p>Loesungen gibt es viele, ich wuerde hier <a href="http://www.parashift.com/c++-faq/named-ctor-idiom.html" rel="nofollow">Named Contructor Idiom</a> bevorzugen. Nur weil ein einzelner Parameter anders ist, wuerde ich es nicht im Typen nach aussen tragen.</p>
<blockquote>
<p>Das würde ich gerne eleganter mit Templates lösen</p>
</blockquote>
<p>Nein, ist es nicht, wobei es stark vom Rest der Klasse und der Verwendung abhaengt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379882</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 27 Jan 2014 12:58:33 GMT</pubDate></item><item><title><![CDATA[Reply to template frage on Mon, 27 Jan 2014 13:57:20 GMT]]></title><description><![CDATA[<p>Was ich mal gemacht habe (wobei bei mir die einzelnen Protokolle auch noch Templates waren, für IPv4 oder IPv6 (oder Dual Stack, also beides)):</p>
<pre><code class="language-cpp">struct protocol_base {
   typedef socket_t /* systemspezifisch */
   ...
};

struct tcp : protocol_base {
   typedef address_t /* systemspezifisch */
   ...
};

struct udp : protocol_base {
   ...
};

... // structs für andere Protokolltypen

template &lt;typename Protocol&gt;
class socket_interface { };

template &lt;&gt;
class socket_interface&lt;tcp&gt; {
public:
   void send(...); // TCP-send
   void connect(...); // kann nur TCP
   ...

};

template &lt;&gt;
class socket_interface&lt;udp&gt; {
public:
   void send(...); // udp-send
   void recv(...);
   ...
};

template &lt;typename Protocol&gt;
class basic_socket : socket_interface&lt;Protocol&gt; {
   ...
};

typedef basic_socket&lt;tcp&gt; tcp_socket;
typedef basic_socket&lt;udp&gt; udp_socket;

tcp_socket s;
s.connect(...);

udp_socket ss;
ss.connect(...); // outch, interface nicht veerbt
</code></pre>
<p>Allerdings muss man u.U. Tipp 43 aus Effective C++ beachten.<br />
Keine Ahnung, ob das sonderlich praktisch in allen Lebenslagen ist, aber ich fand, es war mal eine ganz nette Alternative zu virtuellen Funktionen in meiner Netzwerklibrary und je nach Templateparameter gibt es auch andere Memberfunktionen (z.B. kein connect() bei UDP) + man kann alle systemabh. Typen in den Protokollstructs mit typedefs aliasen und einheitlich drauf zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379897</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Mon, 27 Jan 2014 13:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to template frage on Tue, 28 Jan 2014 15:18:21 GMT]]></title><description><![CDATA[<p>Danke erstmal an die Antworten!</p>
<p>Mein Design sieht momentan noch folgendermaßen aus:</p>
<pre><code>// für getaddrinfo	
   struct net_info
	{
	public:
		// ...

		template &lt;typename socket_type&gt;
		void fill(const std::string &amp;host, const std::string &amp;port) {};

		template &lt;&gt;
		void fill&lt;tcp&gt;(const std::string &amp;host, const std::string &amp;port)
		{
			addrinfo hints;
			hints.ai_socktype = SOCK_STREAM;
			// ...
		}

		template &lt;&gt;
		void fill&lt;udp&gt;(const std::string &amp;host, const std::string &amp;port)
		{
			addrinfo hints;
			hints.ai_socktype = SOCK_DGRAM;
			// ...
		}
	};

	template &lt;typename socket_type&gt;
	class basic_socket : public network_error // für Fehlerbehandlung, fail() usw...
	{
	public:
		// ...	

	private:
		SOCKET m_sock;
		net_info m_info;
	};

    template &lt;typename T&gt;
	class socket_acceptor : public basic_socket&lt;tcp&gt; // dieses Erben ist ein Problem
	{
	public:
		// ...
		void bind();
		void listen();

		socket_stream&lt;T&gt; accept();
	};

	template &lt;typename T&gt;
	class socket_connector : public basic_socket&lt;tcp&gt;
	{
	public:
		// ...
		socket_stream&lt;T&gt; connect();
	};

	template &lt;typename protocol&gt;
	class socket_stream {};

	template &lt;&gt;
	class socket_stream&lt;tcp&gt; : public network_error
	{
	public:
		void recv(std::vector&lt;char&gt; &amp;buffer);
		void send(const char *msg, std::size_t length);
	};

	template &lt;&gt;
	class socket_stream&lt;udp&gt;
	{
	public:
		void recv(std::vector&lt;char&gt; &amp;buffer);
		void send(const char *msg, std::size_t length);
	};

   // Später sollten auch noch sachen wie socket_stream&lt;http&gt; usw. möglich sein
</code></pre>
<p>Ich stehe aber noch vor folgenden Problem:</p>
<p>Momentan hat <em>basic_socket</em> die privaten Member <em>SOCKET</em> und <em>net_info</em>. Dadurch müsste ich alle Klassen die davon ableiten als <em>friend</em> deklarieren. Dazu benötigt <em>socket_stream</em> ja auch ein <em>SOCKET</em>, aber nicht <em>net_info</em>. Blöd &quot;gelöst&quot;, irgendwelche Vorschläge?</p>
<p>Generell finde ich das mit dem <em>basic_socket</em> <s>blöd</s> beschissen gelöst ... weiß aber auch gerade nicht wie ich das handeln soll. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2380208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380208</guid><dc:creator><![CDATA[template_nooob]]></dc:creator><pubDate>Tue, 28 Jan 2014 15:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to template frage on Tue, 28 Jan 2014 17:38:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Allerdings muss man u.U. Tipp 43 aus Effective C++ beachten.</p>
</blockquote>
<p>Von welcher Edition redest du? Habe in Erinnerung, dass die Ordnung unterschiedlich ist.</p>
<p>Ansonsten: Ich finds Overkill.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380251</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 28 Jan 2014 17:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to template frage on Tue, 28 Jan 2014 20:38:57 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25355">@Jodocus</a><br />
Wozu <code>basic_socket&lt;TCP&gt;</code> und <code>basic_socket&lt;UDP&gt;</code> ?<br />
Wieso nicht einfach <code>tcp_socket</code> und <code>udp_socket</code> als zwei verschiedene Klassen?</p>
<p>Stream-Sockets und Datagram-Sockets sind verschieden genug als dass ich nicht das selbe Template dafür verwenden würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380294</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 28 Jan 2014 20:38:57 GMT</pubDate></item></channel></rss>