<?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-Funktion für Heap und Stack-Objekte]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte in einer Template-Funktion, die eine Factory übergeben kriegt, sowohl die Erzeugung von Stack als auch von Heap-Elementen ermöglichen. Diese Objekte werden dann in einem Vektor gespeichert und verarbeitet. Generell kennzeichne ich die Objektzugehörigkeit von Heap-Objekten durch einen std::unique_ptr und übertrage sie dann in einen boost::vector_ptr.</p>
<p>Deswegen habe ich mir nun folgenden Ansatz überlegt:</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;boost/ptr_container/ptr_vector.hpp&gt;

struct Foo{
	Foo(int id) : id(id) {}
	int id;
};

static int counter = 0;

template&lt;typename T&gt;
class TypeInfo{
public:
	typedef std::vector&lt;T&gt; owner_vector;
	static T&amp; remove_ownership(T&amp; t){
		return t;
	}
	static T&amp; dereference(T&amp; t){
		return t;
	}
};

template&lt;typename T&gt;
class TypeInfo&lt;std::unique_ptr&lt;T&gt; &gt;{
public:
	typedef boost::ptr_vector&lt;T&gt; owner_vector;
	static T* remove_ownership(std::unique_ptr&lt;T&gt;&amp; t){
		return t.release();
	}
	static T&amp; dereference(std::unique_ptr&lt;T&gt;&amp; t){
		return *t.get();
	}
};

class HeapFactory{
public:
	typedef std::unique_ptr&lt;Foo&gt; type;
	type create() const{
		return type(new Foo(counter++));
	};
};

class StackFactory{
public:
	typedef Foo type;
	type create() const{
		return Foo(++counter);
	}
};

template&lt;typename TFactory&gt;
void process(const TFactory&amp; factory){
	typedef typename TFactory::type type;
	typedef TypeInfo&lt;type&gt; type_info;
	typedef typename type_info::owner_vector vector_type;
	vector_type vec;
	for(int i=0; i&lt;10; ++i){
		type t = factory.create();
		std::cout &lt;&lt; type_info::dereference(t).id &lt;&lt; std::endl;
		vec.push_back(type_info::remove_ownership(t));	
	}
	std::cout &lt;&lt; vec[4].id &lt;&lt; std::endl;
	for(typename vector_type::reference o : vec){
		std::cout &lt;&lt; o.id &lt;&lt; std::endl;
	}
}

int main(){
	process(HeapFactory());
	process(StackFactory());
}
</code></pre>
<p>Würdet ihr es ähnlich machen oder wie würdet ihr es verwirklichen?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291057/template-funktion-für-heap-und-stack-objekte</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 22:20:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291057.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Aug 2011 23:43:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Funktion für Heap und Stack-Objekte on Tue, 09 Aug 2011 23:43:20 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte in einer Template-Funktion, die eine Factory übergeben kriegt, sowohl die Erzeugung von Stack als auch von Heap-Elementen ermöglichen. Diese Objekte werden dann in einem Vektor gespeichert und verarbeitet. Generell kennzeichne ich die Objektzugehörigkeit von Heap-Objekten durch einen std::unique_ptr und übertrage sie dann in einen boost::vector_ptr.</p>
<p>Deswegen habe ich mir nun folgenden Ansatz überlegt:</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;boost/ptr_container/ptr_vector.hpp&gt;

struct Foo{
	Foo(int id) : id(id) {}
	int id;
};

static int counter = 0;

template&lt;typename T&gt;
class TypeInfo{
public:
	typedef std::vector&lt;T&gt; owner_vector;
	static T&amp; remove_ownership(T&amp; t){
		return t;
	}
	static T&amp; dereference(T&amp; t){
		return t;
	}
};

template&lt;typename T&gt;
class TypeInfo&lt;std::unique_ptr&lt;T&gt; &gt;{
public:
	typedef boost::ptr_vector&lt;T&gt; owner_vector;
	static T* remove_ownership(std::unique_ptr&lt;T&gt;&amp; t){
		return t.release();
	}
	static T&amp; dereference(std::unique_ptr&lt;T&gt;&amp; t){
		return *t.get();
	}
};

class HeapFactory{
public:
	typedef std::unique_ptr&lt;Foo&gt; type;
	type create() const{
		return type(new Foo(counter++));
	};
};

class StackFactory{
public:
	typedef Foo type;
	type create() const{
		return Foo(++counter);
	}
};

template&lt;typename TFactory&gt;
void process(const TFactory&amp; factory){
	typedef typename TFactory::type type;
	typedef TypeInfo&lt;type&gt; type_info;
	typedef typename type_info::owner_vector vector_type;
	vector_type vec;
	for(int i=0; i&lt;10; ++i){
		type t = factory.create();
		std::cout &lt;&lt; type_info::dereference(t).id &lt;&lt; std::endl;
		vec.push_back(type_info::remove_ownership(t));	
	}
	std::cout &lt;&lt; vec[4].id &lt;&lt; std::endl;
	for(typename vector_type::reference o : vec){
		std::cout &lt;&lt; o.id &lt;&lt; std::endl;
	}
}

int main(){
	process(HeapFactory());
	process(StackFactory());
}
</code></pre>
<p>Würdet ihr es ähnlich machen oder wie würdet ihr es verwirklichen?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104200</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 09 Aug 2011 23:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für Heap und Stack-Objekte on Wed, 10 Aug 2011 15:46:56 GMT]]></title><description><![CDATA[<p>Ich hab mir deinen Code nicht wirklich angeschaut, aber ich würde es mit einem Allokator machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104513</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 10 Aug 2011 15:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für Heap und Stack-Objekte on Wed, 10 Aug 2011 16:23:29 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Ich hab mir deinen Code nicht wirklich angeschaut, aber ich würde es mit einem Allokator machen.</p>
</blockquote>
<p>Danke dir EOutOfResources, allerdings versteh ich nicht wie mich das weiterbringen könnte. Ich habe noch nicht wirklich eigene Allokatoren verwendet, aber sie regeln doch afaik 'nur' die Art der Speicherbeschaffung oder sehe ich das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104532</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Wed, 10 Aug 2011 16:23:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für Heap und Stack-Objekte on Wed, 10 Aug 2011 18:20:30 GMT]]></title><description><![CDATA[<p>Also ich finde es clever, wenn auch ein wenig aufwändig. Allerdings denke ich nicht, dass man genau diese wirkung mit Allokatoren erzielen kann... Schließlich arbeitet der allokator ja mit dem heap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104601</guid><dc:creator><![CDATA[Cachus]]></dc:creator><pubDate>Wed, 10 Aug 2011 18:20:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für Heap und Stack-Objekte on Wed, 10 Aug 2011 20:15:02 GMT]]></title><description><![CDATA[<p>Danke für deine Einschätzung!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104642</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Wed, 10 Aug 2011 20:15:02 GMT</pubDate></item></channel></rss>