<?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[datentyp clonen]]></title><description><![CDATA[<p>Kann ich irgendwie einen Datentyp erstellen, der sich genau wie ein anderer verhält, aber den anderen als member hat?<br />
Sie soll die auszuführenden Operationen also nicht auf sich selbst ausführen sondern auf der durch den Template-Parameter angegebenen Klasse, von der sie eine Referenz gespeichert hat...</p>
<p>Was ich in etwa möchte, ist evtl am besten/einfachsten mit nem Stück Code zu zeigen:</p>
<pre><code class="language-cpp">template&lt;typename TAlloc&gt;
class alloc_wrapper
{
public:
	typedef typename TAlloc::value_type              value_type;

	typedef typename TAlloc::pointer                    pointer;
	typedef typename TAlloc::const_pointer        const_pointer;
	typedef typename TAlloc::reference                reference;
	typedef typename TAlloc::const_reference    const_reference;

	typedef typename TAlloc::difference_type    difference_type;
	typedef typename TAlloc::size_type                size_type;

	template&lt;typename U&gt;
	struct rebind
	{
		alloc_wrapper&lt; TAlloc::rebind&lt;U&gt; &gt; other;
	};

	alloc_wrapper(TAlloc &amp;tmp)
	:	myself(&amp;tmp)
	{}

	alloc_wrapper(const alloc_wrapper&amp;) {/**/}
	alloc_wrapper&amp; operator= (const alloc_wrapper &amp;) {/**/}

//hier sollen alle alloc_wrapper funktionen bereit gestellt sein, die immer so hier ausgeführt werden:

	T foo(U u, V v)
	{
		return myself-&gt;foo(u, v);
	}
private:
	TAlloc *myself; //swappable reference
};
</code></pre>
<p>Falls das nicht geht, würde ich den Allocator wohl nur mit den, im Standard festgelegten, Funktionen implementieren und eben ein wenig tippen müssen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249983/datentyp-clonen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 05:57:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249983.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Sep 2009 21:15:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 21:15:46 GMT]]></title><description><![CDATA[<p>Kann ich irgendwie einen Datentyp erstellen, der sich genau wie ein anderer verhält, aber den anderen als member hat?<br />
Sie soll die auszuführenden Operationen also nicht auf sich selbst ausführen sondern auf der durch den Template-Parameter angegebenen Klasse, von der sie eine Referenz gespeichert hat...</p>
<p>Was ich in etwa möchte, ist evtl am besten/einfachsten mit nem Stück Code zu zeigen:</p>
<pre><code class="language-cpp">template&lt;typename TAlloc&gt;
class alloc_wrapper
{
public:
	typedef typename TAlloc::value_type              value_type;

	typedef typename TAlloc::pointer                    pointer;
	typedef typename TAlloc::const_pointer        const_pointer;
	typedef typename TAlloc::reference                reference;
	typedef typename TAlloc::const_reference    const_reference;

	typedef typename TAlloc::difference_type    difference_type;
	typedef typename TAlloc::size_type                size_type;

	template&lt;typename U&gt;
	struct rebind
	{
		alloc_wrapper&lt; TAlloc::rebind&lt;U&gt; &gt; other;
	};

	alloc_wrapper(TAlloc &amp;tmp)
	:	myself(&amp;tmp)
	{}

	alloc_wrapper(const alloc_wrapper&amp;) {/**/}
	alloc_wrapper&amp; operator= (const alloc_wrapper &amp;) {/**/}

//hier sollen alle alloc_wrapper funktionen bereit gestellt sein, die immer so hier ausgeführt werden:

	T foo(U u, V v)
	{
		return myself-&gt;foo(u, v);
	}
private:
	TAlloc *myself; //swappable reference
};
</code></pre>
<p>Falls das nicht geht, würde ich den Allocator wohl nur mit den, im Standard festgelegten, Funktionen implementieren und eben ein wenig tippen müssen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778447</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Sep 2009 21:15:46 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 21:35:16 GMT]]></title><description><![CDATA[<p>Wie soll das mit dem rebind funktionieren ohne Defaultkonstruktor?<br />
Ultimativ glaube ich nicht, dass es möglich ist, string mittels eines anderen Standardcontainers (außer vector) sinnvoll zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778461</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Sep 2009 21:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 21:39:48 GMT]]></title><description><![CDATA[<p>Was ich mir vorstellen könnte: Du benutzt deine Klasse wie einen Zeiger und überlädst die Dereferenzierungsoperatoren so, dass sie auf den Datamember verweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778464</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 Sep 2009 21:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 21:47:00 GMT]]></title><description><![CDATA[<p>Was spricht gegen eine Ableitung? Also sowas wie</p>
<pre><code class="language-cpp">template&lt;class TAlloc&gt; class alloc_wrapper : public TAlloc { ... };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1778467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778467</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 14 Sep 2009 21:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 21:48:10 GMT]]></title><description><![CDATA[<p>XMaster schrieb:</p>
<blockquote>
<p>Was spricht gegen eine Ableitung?</p>
</blockquote>
<p>Die Tatsache, dass das eigentliche Allokatorobjekt nicht im Wrapper selbst gespeichert sein soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778468</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Sep 2009 21:48:10 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 21:48:46 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Wie soll das mit dem rebind funktionieren ohne Defaultkonstruktor?</p>
</blockquote>
<p>Imho brauch man den nie...</p>
<p>camper schrieb:</p>
<blockquote>
<p>Ultimativ glaube ich nicht, dass es möglich ist, string mittels eines anderen Standardcontainers (außer vector) sinnvoll zu implementieren.</p>
</blockquote>
<p>Ich denke schon - wenn ich das mit dem allocator iwie hinbekommen habe, dann bin ich eigtl fertig - die einzige einschränkung wäre dann, dass compare nicht die traits_type::compare fkt nutzt - aber das wäre ohne weiteres möglich (nur performace-technisch eher doof^^)</p>
<p>bb</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:<br />
Ne, man soll ihn noch ganz normal verwenden können - wie immer halt... Evtl gehts mit nem konvertierungsoperator - ich test es aber erst mal mit dem wrappen der standard-funktionen und dann mal gucken, ob es auch noch schöner geht^^</p>
<p>@XMaster:<br />
Das die Operationen auf einer anderen Instanz abgewickelt werden sollen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778470</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Sep 2009 21:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 21:57:35 GMT]]></title><description><![CDATA[<p>Ohne Defaultkonstruktor kann ein Container keine Allokatoren für andere Typen erstellen. Container, die keine anderen Allokatoren benötigen, gibt es nicht viele. Abgesehen von vector dürften praktisch alle anderen Standardcontainer etwas anderes als den übergebenen Allokator verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778474</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Sep 2009 21:57:35 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 22:00:11 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ohne Defaultkonstruktor kann ein Container keine Allokatoren für andere Typen erstellen. Container, die keine anderen Allokatoren benötigen, gibt es nicht viele. Abgesehen von vector dürften praktisch alle anderen Standardcontainer etwas anderes als den übergebenen Allokator verwenden.</p>
</blockquote>
<p>Ich dachte immer, dass das per copy-ctor gemacht wird!?</p>
<pre><code class="language-cpp">template&lt; typename T, typename A&gt;
struct container
{
  struct node;
  typedef A::rebind&lt;node&gt; Tmy_alloc;

  container(const A &amp;_my_alloc) : my_alloc(_my_alloc) {}

  Tmy_alloc my_alloc;
};
</code></pre>
<p>!?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778475</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Sep 2009 22:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 22:08:34 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Ich dachte immer, dass das per copy-ctor gemacht wird!?</p>
</blockquote>
<p>Und was hat der Typ A mit A::rebind&lt;node&gt;::other zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778477</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Sep 2009 22:08:34 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 22:16:12 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>Ich dachte immer, dass das per copy-ctor gemacht wird!?</p>
</blockquote>
<p>Und was hat der Typ A mit A::rebind&lt;node&gt;::other zu tun?</p>
</blockquote>
<p>das der allocator auf den node-typ rebinded wird? Oo<br />
allerdings so:<br />
<code>typedef typename A::rebind&lt;node&gt;::other Tmy_alloc;</code></p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778479</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Sep 2009 22:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 22:20:48 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>Ich dachte immer, dass das per copy-ctor gemacht wird!?</p>
</blockquote>
<p>Und was hat der Typ A mit A::rebind&lt;node&gt;::other zu tun?</p>
</blockquote>
<p>das der allocator auf den node-typ rebinded wird? Oo<br />
allerdings so:<br />
<code>typedef typename A::rebind&lt;node&gt;::other Tmy_alloc;</code></p>
<p>bb</p>
</blockquote>
<p>Stimmt. Aber es sind verschiedene Typen, oder? Wie willst du sie dann mittels Copyctor kopieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778481</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Sep 2009 22:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Mon, 14 Sep 2009 23:25:32 GMT]]></title><description><![CDATA[<p>hmm... bis vorhin dachte ich noch, dass ich da bissl wild rumcasten kann, da weder ctor noch dtor aufgerufen werden müssen, weil eh alles nur Zeichen sind, aber die nodes brauchen ja trotzdem nen ctor/dtor - ma gucken, ob mir irgendwann mal noch was anderes einfällt : D</p>
<p>bb</p>
<p>eidt: Es würde aber gehen, wenn man an den Container-Allokator rankommen würde^^ Leider wird es da keinen Standard-konformen Weg geben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778496</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Sep 2009 23:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Tue, 15 Sep 2009 15:36:15 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ultimativ glaube ich nicht, dass es möglich ist, string mittels eines anderen Standardcontainers (außer vector) sinnvoll zu implementieren.</p>
</blockquote>
<p>Japp - nach stundenlangem Probieren, denk ich jetzt auch so darüber^^</p>
<p>Ich hab mich einfach ein wenig vom standard entfernt und c_str() und data() nicht als member-fkt angeboten (was den weiteren nachteil hat, dass man keinen allocator anbieten kann - wobei das ohne weiteres möglich sein sollte - muss man nur noch mal allocator und laenge in der hilfs-klasse speichern)</p>
<pre><code class="language-cpp">template &lt;typename C&gt;
struct c_str_ptr
{
private:
	const C *data;

	c_str_ptr(const c_str_ptr&amp;);
	c_str_ptr&amp; operator= (const c_str_ptr&amp;);
public:
	c_str_ptr(const C *_data) : data(_data) {}
	~c_str_ptr() {delete []data;}

	operator const C*() {return data;}
};

template&lt;typename C, typename T, typename A, template &lt;typename, typename&gt; class V&gt;
c_str_ptr&lt;C&gt; c_str(const my::basic_string&lt;C, T, A, V&gt; &amp;these)
{
	C* R = new C[these.size()+1];
	std::copy(these.begin(), these.end(), R);
	R[these.size()] = C();
	return R;
}

template&lt;typename C, typename T, typename A, template &lt;typename, typename&gt; class V&gt;
c_str_ptr&lt;C&gt; data(const my::basic_string&lt;C, T, A, V&gt; &amp;these)
{
	C* R = new C[these.size()];
	std::copy(these.begin(), these.end(), R);
	return R;
}
</code></pre>
<p>bb</p>
<p>edit: op const char* -&gt; op const C*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778846</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 15 Sep 2009 15:36:15 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Tue, 15 Sep 2009 15:08:46 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">C *data;
// ...
	operator const char*() {return data;}
</code></pre>
</blockquote>
<p>wäre nicht operator const C*() besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778888</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 15 Sep 2009 15:08:46 GMT</pubDate></item><item><title><![CDATA[Reply to datentyp clonen on Tue, 15 Sep 2009 15:35:43 GMT]]></title><description><![CDATA[<p>XMaster schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">C *data;
// ...
	operator const char*() {return data;}
</code></pre>
</blockquote>
<p>wäre nicht operator const C*() besser?</p>
</blockquote>
<p>oh, ja - sicher<br />
danke : &gt;<br />
habs ma editiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778896</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 15 Sep 2009 15:35:43 GMT</pubDate></item></channel></rss>