<?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[Enumerable&amp;lt;T&amp;gt; Adaption aus C#]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich wollte euch mal etwas vorstellen und mir Kritik und Meinungen einholen.<br />
Da ich aus der C# Ecke komme und jetzt wieder zu meinen Wurzeln(C++) zurueck gefunden habe, wollte ich mir etwas aehnliches wie die Enumerable Klasse aus C# implementieren.<br />
Ich bin erstmal ganz naiv ran gegangen und habt das mit einer internen std::list gemacht, und hab mir so ein paar wichtige Funktionen wie where mit in das oeffentliche Interface der Klasse reingenommen.</p>
<pre><code class="language-cpp">#ifndef ENUMERABLE_H_INCLUDED
#define ENUMERABLE_H_INCLUDED

#include &lt;list&gt;
#include &lt;functional&gt;
#include &lt;iostream&gt;
template&lt;typename T&gt;
class Enumerable
{
	private:
		std::list&lt;T&gt; list;
	public:
		typedef typename std::list&lt;T&gt;::iterator iterator;
		typedef typename std::list&lt;T&gt;::const_iterator const_iterator;
	public:
		Enumerable();
		Enumerable(const Enumerable&amp; enumerable);
		Enumerable(typename std::list&lt;T&gt;::const_iterator begin,typename std::list&lt;T&gt;::const_iterator end);
		Enumerable where(std::tr1::function&lt;bool (const T&amp; value)&gt;)const;
		void sort(std::tr1::function&lt;bool (const T&amp;, const T&amp;)&gt;);
		void push_back(const T&amp; value);
		void remove(const T&amp; value);
		void clear();
		iterator begin();
		iterator end();

		const_iterator begin() const;
		const_iterator end() const;
		size_t size() const;
};

template&lt;typename T&gt;
Enumerable&lt;T&gt;::Enumerable(){}

template&lt;typename T&gt;
Enumerable&lt;T&gt;::Enumerable(typename std::list&lt;T&gt;::const_iterator begin,typename std::list&lt;T&gt;::const_iterator end)
{
	this-&gt;list.assign(begin, end);
}

template&lt;typename T&gt;
Enumerable&lt;T&gt;::Enumerable(const Enumerable&amp; enumerable)
{
	this-&gt;list.assign(enumerable.begin(), enumerable.end());
}

template&lt;typename T&gt;
Enumerable&lt;T&gt; Enumerable&lt;T&gt;::where(std::tr1::function&lt;bool (const T&amp; value)&gt; predicate)const
{
	std::list&lt;T&gt; temp;
	typename std::list&lt;T&gt;::const_iterator begin = this-&gt;list.begin();
	typename std::list&lt;T&gt;::const_iterator end = this-&gt;list.end();
	while(begin != end)
	{
		if(predicate(*begin))
		{
			temp.push_back(*begin);

		}
		begin++;

	}

	return Enumerable&lt;T&gt;(temp.begin(), temp.end());
}

template&lt;typename T&gt;
void Enumerable&lt;T&gt;::sort(std::tr1::function&lt;bool (const T&amp;, const T&amp;)&gt; sorter)
{
	this-&gt;list.sort(sorter);
}

template&lt;typename T&gt;
void Enumerable&lt;T&gt;::push_back(const T&amp; value)
{
	this-&gt;list.push_back(value);
}

template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::iterator Enumerable&lt;T&gt;::begin()
{
	return this-&gt;list.begin();
}

template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::iterator Enumerable&lt;T&gt;::end()
{
	return this-&gt;list.end();
}
template&lt;typename T&gt;
size_t Enumerable&lt;T&gt;::size() const
{
	return this-&gt;list.size();
}
template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::const_iterator Enumerable&lt;T&gt;::begin() const
{
	return this-&gt;list.begin();
}
template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::const_iterator Enumerable&lt;T&gt;::end() const
{
	return this-&gt;list.end();
}
template&lt;typename T&gt;
void Enumerable&lt;T&gt;::remove(const T&amp; value)
{
	this-&gt;list.remove(value);
}

template&lt;typename T&gt;
void Enumerable&lt;T&gt;::clear()
{
	this-&gt;list.clear();
}

#endif // ENUMERABLE_H_INCLUDED
</code></pre>
<p>Ich weiß das hier noch ein paar Funktionen fehlen, aber ich wollte einfach mal in den Wald reinhorchen und fragen ob ihr noch Anregungen fuer mich habt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298425/enumerable-lt-t-gt-adaption-aus-c</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 19:50:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298425.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Jan 2012 18:54:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Enumerable&amp;lt;T&amp;gt; Adaption aus C# on Thu, 19 Jan 2012 18:54:16 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich wollte euch mal etwas vorstellen und mir Kritik und Meinungen einholen.<br />
Da ich aus der C# Ecke komme und jetzt wieder zu meinen Wurzeln(C++) zurueck gefunden habe, wollte ich mir etwas aehnliches wie die Enumerable Klasse aus C# implementieren.<br />
Ich bin erstmal ganz naiv ran gegangen und habt das mit einer internen std::list gemacht, und hab mir so ein paar wichtige Funktionen wie where mit in das oeffentliche Interface der Klasse reingenommen.</p>
<pre><code class="language-cpp">#ifndef ENUMERABLE_H_INCLUDED
#define ENUMERABLE_H_INCLUDED

#include &lt;list&gt;
#include &lt;functional&gt;
#include &lt;iostream&gt;
template&lt;typename T&gt;
class Enumerable
{
	private:
		std::list&lt;T&gt; list;
	public:
		typedef typename std::list&lt;T&gt;::iterator iterator;
		typedef typename std::list&lt;T&gt;::const_iterator const_iterator;
	public:
		Enumerable();
		Enumerable(const Enumerable&amp; enumerable);
		Enumerable(typename std::list&lt;T&gt;::const_iterator begin,typename std::list&lt;T&gt;::const_iterator end);
		Enumerable where(std::tr1::function&lt;bool (const T&amp; value)&gt;)const;
		void sort(std::tr1::function&lt;bool (const T&amp;, const T&amp;)&gt;);
		void push_back(const T&amp; value);
		void remove(const T&amp; value);
		void clear();
		iterator begin();
		iterator end();

		const_iterator begin() const;
		const_iterator end() const;
		size_t size() const;
};

template&lt;typename T&gt;
Enumerable&lt;T&gt;::Enumerable(){}

template&lt;typename T&gt;
Enumerable&lt;T&gt;::Enumerable(typename std::list&lt;T&gt;::const_iterator begin,typename std::list&lt;T&gt;::const_iterator end)
{
	this-&gt;list.assign(begin, end);
}

template&lt;typename T&gt;
Enumerable&lt;T&gt;::Enumerable(const Enumerable&amp; enumerable)
{
	this-&gt;list.assign(enumerable.begin(), enumerable.end());
}

template&lt;typename T&gt;
Enumerable&lt;T&gt; Enumerable&lt;T&gt;::where(std::tr1::function&lt;bool (const T&amp; value)&gt; predicate)const
{
	std::list&lt;T&gt; temp;
	typename std::list&lt;T&gt;::const_iterator begin = this-&gt;list.begin();
	typename std::list&lt;T&gt;::const_iterator end = this-&gt;list.end();
	while(begin != end)
	{
		if(predicate(*begin))
		{
			temp.push_back(*begin);

		}
		begin++;

	}

	return Enumerable&lt;T&gt;(temp.begin(), temp.end());
}

template&lt;typename T&gt;
void Enumerable&lt;T&gt;::sort(std::tr1::function&lt;bool (const T&amp;, const T&amp;)&gt; sorter)
{
	this-&gt;list.sort(sorter);
}

template&lt;typename T&gt;
void Enumerable&lt;T&gt;::push_back(const T&amp; value)
{
	this-&gt;list.push_back(value);
}

template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::iterator Enumerable&lt;T&gt;::begin()
{
	return this-&gt;list.begin();
}

template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::iterator Enumerable&lt;T&gt;::end()
{
	return this-&gt;list.end();
}
template&lt;typename T&gt;
size_t Enumerable&lt;T&gt;::size() const
{
	return this-&gt;list.size();
}
template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::const_iterator Enumerable&lt;T&gt;::begin() const
{
	return this-&gt;list.begin();
}
template&lt;typename T&gt;
typename Enumerable&lt;T&gt;::const_iterator Enumerable&lt;T&gt;::end() const
{
	return this-&gt;list.end();
}
template&lt;typename T&gt;
void Enumerable&lt;T&gt;::remove(const T&amp; value)
{
	this-&gt;list.remove(value);
}

template&lt;typename T&gt;
void Enumerable&lt;T&gt;::clear()
{
	this-&gt;list.clear();
}

#endif // ENUMERABLE_H_INCLUDED
</code></pre>
<p>Ich weiß das hier noch ein paar Funktionen fehlen, aber ich wollte einfach mal in den Wald reinhorchen und fragen ob ihr noch Anregungen fuer mich habt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170184</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 19 Jan 2012 18:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to Enumerable&amp;lt;T&amp;gt; Adaption aus C# on Thu, 19 Jan 2012 19:03:41 GMT]]></title><description><![CDATA[<p>Was ist der Vorteil gegenüber rohen Containern wenn ich fragen darf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170189</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 19 Jan 2012 19:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to Enumerable&amp;lt;T&amp;gt; Adaption aus C# on Thu, 19 Jan 2012 19:07:23 GMT]]></title><description><![CDATA[<p>Ich weiß das man mit den Standard-Algorithmen sicherlich so einen Mechanismus des &quot;Where&quot; abdecken kann. Aber mir persoenlich gefaellt es besser wenn ich eine Methode und Klasse habe die diese Logik kapseln. Ich sagte auch bereits das hier noch diverse Methoden fehlen.</p>
<p>Siehe <a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods.aspx</a></p>
<p>Das ist in etwa der Umfang den ich anbieten moechte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170191</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 19 Jan 2012 19:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to Enumerable&amp;lt;T&amp;gt; Adaption aus C# on Thu, 19 Jan 2012 19:17:29 GMT]]></title><description><![CDATA[<p>Okay, dann bau zumindestens den Container-Typ als Template-Parameter ein (kannst ja einen Default nehmen) und bau alles so um, dass ein Enumerable&lt;int, std::vector&gt; auch mit einem Enumerable&lt;int, std::list&gt; etc funktioniert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170202</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 19 Jan 2012 19:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to Enumerable&amp;lt;T&amp;gt; Adaption aus C# on Thu, 19 Jan 2012 19:21:51 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Okay, dann bau zumindestens den Container-Typ als Template-Parameter ein (kannst ja einen Default nehmen) und bau alles so um, dass ein Enumerable&lt;int, std::vector&gt; auch mit einem Enumerable&lt;int, std::list&gt; etc funktioniert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Das ist ne super Idee, danke fuer den Hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170205</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 19 Jan 2012 19:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to Enumerable&amp;lt;T&amp;gt; Adaption aus C# on Thu, 19 Jan 2012 21:59:33 GMT]]></title><description><![CDATA[<p>In LINQ gibt es im Gegensatz zu deiner Klasse kein push_back/remove/clear. Weil es auf Enumerationen keinen Sinn macht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170288</guid><dc:creator><![CDATA[atc]]></dc:creator><pubDate>Thu, 19 Jan 2012 21:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to Enumerable&amp;lt;T&amp;gt; Adaption aus C# on Thu, 19 Jan 2012 22:03:36 GMT]]></title><description><![CDATA[<p><a href="http://code.google.com/p/boolinq/" rel="nofollow">http://code.google.com/p/boolinq/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170291</guid><dc:creator><![CDATA[boolinq]]></dc:creator><pubDate>Thu, 19 Jan 2012 22:03:36 GMT</pubDate></item></channel></rss>