<?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[Von Indexiteratoren und Threads die mit Von beginnen]]></title><description><![CDATA[<p>Heute eine Schwemme von mir, entschuldigung <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>
<p>Ich habe im Schweiße meines Angesichts einen folgenden Iterator geschrieben:</p>
<pre><code class="language-cpp">struct default_tag {};

		template&lt; typename ReferenceType, typename PointerType, typename Tag, typename SizeType = std::size_t &gt;
		struct do_dereference {
			static ReferenceType dereference( PointerType obj_, SizeType index_ )
			{
				return obj_-&gt;dereference( index_, Tag() );
			}
		};

		template&lt; typename ReferenceType, typename PointerType, typename SizeType &gt;
		struct do_dereference&lt; ReferenceType, PointerType, default_tag, SizeType &gt; {
			static ReferenceType dereference( PointerType obj_, SizeType index_ )
			{
				return obj_-&gt;dereference( index_ );
			}
		};

		template&lt; typename ValueType, typename FriendClass, bool IsConst, typename Tag = default_tag, typename SizeType = std::size_t &gt;
		class index_iterator : 
public boost::iterator_facade&lt; index_iterator&lt; ValueType, FriendClass, IsConst, Tag, SizeType &gt;,
typename std::conditional&lt; IsConst, const ValueType, ValueType &gt;::type, std::random_access_iterator_tag &gt; {
		private:
			typedef Tag tag_type;
			typedef SizeType size_type;
			friend FriendClass;

		public:
			typedef typename std::conditional&lt; IsConst, const FriendClass*, FriendClass* &gt;::type pointer_type;
			typedef SizeType size_type;

			index_iterator( pointer_type object, size_type index )
				: object_( object ), index_( index )
			{
			}

			index_iterator( const index_iterator&amp; other )
			{
				object_ = other.object_;
				index_ = other.index_;
			}

		public:
			reference dereference() {
				return do_dereference&lt;reference,pointer_type, tag_type&gt;::dereference( object_, index_ );
			}

			const reference dereference() const {
				return do_dereference&lt;const reference,pointer_type, tag_type&gt;::dereference( object_, index_ );
			}

			void increment() {
				++index_;
			}

			void decrement() {
				--index_;
			}

			void advance( size_type off ) {
				index += off;
			}

			bool equal( const index_iterator&amp; other ) const {
				assert( object_ == other.object_ );
				return index_ == other.index_;
			}

			difference_type distance( index_iterator&amp; other ) const {
				return index_ - other.index_;
			}

			operator index_iterator&lt; ValueType, FriendClass, true, Tag, SizeType &gt;() const
			{
				return index_iterator&lt; ValueType, FriendClass, true, Tag, SizeType &gt;( object_, index_ )
			}

		private:
			pointer_type object_;
			size_type get_index() const { return index_; }
			size_type index_;
		};
</code></pre>
<p>Sodass folgendes Minimalbeispiel funktioniert:</p>
<pre><code class="language-cpp">class my_vector {
public:
	typedef utility::index_iterator&lt; double, my_vector, false &gt; iterator;
	typedef utility::index_iterator&lt; double, my_vector, true  &gt; const_iterator;

	iterator begin() {
		return iterator( this, 0 );
	}

	iterator end() {
		return iterator( this, vec_.size() );
	}

	double&amp; dereference( std::size_t index ) {
		return vec_[index];
	}

private:
	std::vector&lt; double &gt; vec_;
};
</code></pre>
<p>Jetzt meine Fragen:<br />
- Gibts sowas schon? Sinnlos?<br />
- Werden die nutzlosen Tag-Argumente vom Compiler wegoptimiert?</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311742/von-indexiteratoren-und-threads-die-mit-von-beginnen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 11:30:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311742.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Dec 2012 17:32:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Von Indexiteratoren und Threads die mit Von beginnen on Thu, 13 Dec 2012 19:12:13 GMT]]></title><description><![CDATA[<p>Heute eine Schwemme von mir, entschuldigung <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>
<p>Ich habe im Schweiße meines Angesichts einen folgenden Iterator geschrieben:</p>
<pre><code class="language-cpp">struct default_tag {};

		template&lt; typename ReferenceType, typename PointerType, typename Tag, typename SizeType = std::size_t &gt;
		struct do_dereference {
			static ReferenceType dereference( PointerType obj_, SizeType index_ )
			{
				return obj_-&gt;dereference( index_, Tag() );
			}
		};

		template&lt; typename ReferenceType, typename PointerType, typename SizeType &gt;
		struct do_dereference&lt; ReferenceType, PointerType, default_tag, SizeType &gt; {
			static ReferenceType dereference( PointerType obj_, SizeType index_ )
			{
				return obj_-&gt;dereference( index_ );
			}
		};

		template&lt; typename ValueType, typename FriendClass, bool IsConst, typename Tag = default_tag, typename SizeType = std::size_t &gt;
		class index_iterator : 
public boost::iterator_facade&lt; index_iterator&lt; ValueType, FriendClass, IsConst, Tag, SizeType &gt;,
typename std::conditional&lt; IsConst, const ValueType, ValueType &gt;::type, std::random_access_iterator_tag &gt; {
		private:
			typedef Tag tag_type;
			typedef SizeType size_type;
			friend FriendClass;

		public:
			typedef typename std::conditional&lt; IsConst, const FriendClass*, FriendClass* &gt;::type pointer_type;
			typedef SizeType size_type;

			index_iterator( pointer_type object, size_type index )
				: object_( object ), index_( index )
			{
			}

			index_iterator( const index_iterator&amp; other )
			{
				object_ = other.object_;
				index_ = other.index_;
			}

		public:
			reference dereference() {
				return do_dereference&lt;reference,pointer_type, tag_type&gt;::dereference( object_, index_ );
			}

			const reference dereference() const {
				return do_dereference&lt;const reference,pointer_type, tag_type&gt;::dereference( object_, index_ );
			}

			void increment() {
				++index_;
			}

			void decrement() {
				--index_;
			}

			void advance( size_type off ) {
				index += off;
			}

			bool equal( const index_iterator&amp; other ) const {
				assert( object_ == other.object_ );
				return index_ == other.index_;
			}

			difference_type distance( index_iterator&amp; other ) const {
				return index_ - other.index_;
			}

			operator index_iterator&lt; ValueType, FriendClass, true, Tag, SizeType &gt;() const
			{
				return index_iterator&lt; ValueType, FriendClass, true, Tag, SizeType &gt;( object_, index_ )
			}

		private:
			pointer_type object_;
			size_type get_index() const { return index_; }
			size_type index_;
		};
</code></pre>
<p>Sodass folgendes Minimalbeispiel funktioniert:</p>
<pre><code class="language-cpp">class my_vector {
public:
	typedef utility::index_iterator&lt; double, my_vector, false &gt; iterator;
	typedef utility::index_iterator&lt; double, my_vector, true  &gt; const_iterator;

	iterator begin() {
		return iterator( this, 0 );
	}

	iterator end() {
		return iterator( this, vec_.size() );
	}

	double&amp; dereference( std::size_t index ) {
		return vec_[index];
	}

private:
	std::vector&lt; double &gt; vec_;
};
</code></pre>
<p>Jetzt meine Fragen:<br />
- Gibts sowas schon? Sinnlos?<br />
- Werden die nutzlosen Tag-Argumente vom Compiler wegoptimiert?</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2279818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2279818</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 13 Dec 2012 19:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to Von Indexiteratoren und Threads die mit Von beginnen on Thu, 13 Dec 2012 19:01:25 GMT]]></title><description><![CDATA[<p>Beschreibe in WORTEN was dein Gebilde sein soll und welches Problem geloest werden muss!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2279853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2279853</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 13 Dec 2012 19:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to Von Indexiteratoren und Threads die mit Von beginnen on Fri, 14 Dec 2012 08:19:42 GMT]]></title><description><![CDATA[<p>Nun, ich dachte es erschließt sich aus der Beispielklasse da unten.<br />
Diese index_iterator-Klasse ist dazu gedacht, eine Iterator-Sequenz über irgendwas zu bauen, das nicht &quot;direkt da&quot; ist. Also irgendwelche Temp-Objekte oder ähnliches, die aber ansonsten semantisch Random-Accessible sind. Ein Beispiel wäre zum Beispiel (wer sollte es glauben) ein Reihen-Iterator, der intern über einem std::vector&lt; std::vector&lt; some &gt; &gt; läuft, wobei hier die innere Dimension einer Spalte entspricht. Es gibt also nicht direkt Reihen, aber man kann dennoch einen Wrapper für sowas basteln. So, und hier kommt der index_iterator ins Spiel, man entwickelt einen Reihen-Wrapper, implementiert eine dereference-Methode mit oder ohne Tag-Argument (besser mit, wegen Typsicherheit), macht noch einen typedef und ist fertig. Man muss sich also nicht mehr einen pseudo-iterator basteln.</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2279856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2279856</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 14 Dec 2012 08:19:42 GMT</pubDate></item></channel></rss>