<?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[Container für beliebige Typen]]></title><description><![CDATA[<p>Ich frage mich, ob es möglich ist, in C++ einen Container zu implementieren, der Objekte beliebigen Typens halten könnte. Natürlich macht so ein Container im Konzept von C++ wenig bis keinen Sinn, allerdings finde ich die Frage ganz interessant.<br />
Erst hatte ich versucht, dies über Templates und void* zu regeln. Aber irgendwie schaffe ich es nie, eine Version zu schreiben, die compilierbar ist.<br />
Kennt jemand einen Ansatz mit dem so etwas möglich wäre?</p>
<p>mfg intitled</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258929/container-für-beliebige-typen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 02:21:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258929.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Jan 2010 04:44:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 04:44:34 GMT]]></title><description><![CDATA[<p>Ich frage mich, ob es möglich ist, in C++ einen Container zu implementieren, der Objekte beliebigen Typens halten könnte. Natürlich macht so ein Container im Konzept von C++ wenig bis keinen Sinn, allerdings finde ich die Frage ganz interessant.<br />
Erst hatte ich versucht, dies über Templates und void* zu regeln. Aber irgendwie schaffe ich es nie, eine Version zu schreiben, die compilierbar ist.<br />
Kennt jemand einen Ansatz mit dem so etwas möglich wäre?</p>
<p>mfg intitled</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840021</guid><dc:creator><![CDATA[Intitled]]></dc:creator><pubDate>Sun, 17 Jan 2010 04:44:34 GMT</pubDate></item><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 06:56:57 GMT]]></title><description><![CDATA[<p>Von der Idee her z.B. so:</p>
<pre><code class="language-cpp">class Container {
public:
	template&lt;typename T&gt;
	void add(T const&amp; obj)
	{
		T* cpy = new T(obj);
		dataPtrs.push_back(cpy);
	}

	template&lt;typename T&gt;
	T get(size_t pos)
	{
		return *(static_cast&lt;T*&gt;( dataPtrs[pos] ));
	}

private:
	std::vector&lt;void*&gt; dataPtrs;
};

void fill(Container&amp; c){
	float f = 1.4f;
	c.add(f);
	std::string txt = &quot;dfssdfa&quot;;
	c.add(txt);
	int* ptr = new int(3);
	c.add(ptr);
}

int main (int argc, char *argv[])
{
	void(*functionPtr)(Container&amp;) = fill;
	Container c;
	c.add(functionPtr);
	c.get&lt;void(*)(Container&amp;)&gt;(0)(c);
	std::cout&lt;&lt;c.get&lt;float&gt;(1)&lt;&lt;std::endl;
	std::cout&lt;&lt;c.get&lt;std::string&gt;(2)&lt;&lt;std::endl;
	std::cout&lt;&lt;*c.get&lt;int*&gt;(3)&lt;&lt;std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1840024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840024</guid><dc:creator><![CDATA[for(schlag;den;raab)]]></dc:creator><pubDate>Sun, 17 Jan 2010 06:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 08:41:49 GMT]]></title><description><![CDATA[<p>std::vector&lt;<a href="http://www.boost.org/doc/libs/1_41_0/doc/html/any.html" rel="nofollow">boost::any</a>&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840033</guid><dc:creator><![CDATA[ich23]]></dc:creator><pubDate>Sun, 17 Jan 2010 08:41:49 GMT</pubDate></item><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 15:43:48 GMT]]></title><description><![CDATA[<p>Das Problem bei der Variante von <em>for(schlag;den;raab)</em> ist, dass die Typ information verloren geht. Das heißt, du musst wissen, welcher typ in dem Container ist, und den void* zeiger dann dahin gehend reinterpretieren.<br />
Mir ist eher so eine Lösung vorgeschwebt:</p>
<pre><code class="language-cpp">Container c;
c.push_back(2.354);
c.push_back(&quot;hello&quot;);

cout&lt;&lt;c[0]&lt;&lt;c[1];
</code></pre>
<p>Sodass beim Zugriff auf ein Element (muss nicht unbedingt der Indexoperator sein) in den richtigen Typen zurück gecastet wird.</p>
<p>Wie löst denn boost.any das Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840236</guid><dc:creator><![CDATA[Intitled]]></dc:creator><pubDate>Sun, 17 Jan 2010 15:43:48 GMT</pubDate></item><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 16:09:35 GMT]]></title><description><![CDATA[<p>Auch bei boost::any musst du den Typ zurückcasten (via boost::any_cast).</p>
<p>Die einzige Information, die du vorher rausfinden kannst ist die typeid.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840260</guid><dc:creator><![CDATA[BadWolf]]></dc:creator><pubDate>Sun, 17 Jan 2010 16:09:35 GMT</pubDate></item><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 16:12:58 GMT]]></title><description><![CDATA[<p>Intitled schrieb:</p>
<blockquote>
<p>Wie löst denn boost.any das Problem?</p>
</blockquote>
<p>Boost.Any kann selber beliebige Werte beliebiger Typen speichern. Du musst aber immer noch wissen, welcher Typ drinnen steckt!<br />
Die Doku kennst du ja (link oben). Du musst da immer noch den Typen kennen.<br />
Einzige Lösung liegt in einem eigenen kleinen Metasystem, wo du Typen registrieren kannst usw, so wie es QVariant hat. Musst du aber selber schreiben, wenn du nicht Qt verwenden willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840262</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 17 Jan 2010 16:12:58 GMT</pubDate></item><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 16:42:40 GMT]]></title><description><![CDATA[<p>Es gibt auch noch Boost.Variant</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840287</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 17 Jan 2010 16:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to Container für beliebige Typen on Sun, 17 Jan 2010 17:26:55 GMT]]></title><description><![CDATA[<p>Boost::Any sollte so ähnlich aussehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;typeinfo&gt;

class holder {
public:
	virtual const std::type_info&amp; type() const = 0;
};

template &lt;typename T&gt;
struct myholder : public holder {
	myholder(const T&amp; t)
		: val(t) { }
	T val;
	const std::type_info&amp; type() const {
		return typeid(val);
	}
};

class any {
private:
	holder* val;
public:
	template &lt;typename T&gt;
	any(const T&amp; val)
		: val(new myholder&lt;T&gt;(val)) {
	}

	~any() { delete val; }
	const std::type_info&amp; type() const {
		return val-&gt;type();
	}
};

int main() {
	any var = 12;
	any var2 = 'a';
	std::cout &lt;&lt; &quot;Type ID 1: &quot; &lt;&lt; var.type().name() &lt;&lt; &quot;\nType ID 2: &quot; &lt;&lt; var2.type().name() &lt;&lt; std::endl;
}
</code></pre>
<p>Durch virtuelle Funktionen und RTTI ist das aber nicht wirklich schnell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840327</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 17 Jan 2010 17:26:55 GMT</pubDate></item></channel></rss>