<?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[std::map mit std::type_info als Schlüssel, darf ich das so machen?]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Ich brauche gerade eine Funktionalität, welche schon fast ein wenig in Richtung Reflection geht (nichts grossartiges, einfach mehr als pures RTTI), und wollte dazu eine <code>std::map</code> mit <code>std::type_info</code> als Schlüssel definieren.</p>
<p>Damit das geht, brauche ich jedoch einen <code>operator&lt;</code> für <code>type_info</code> , welchen es nicht gibt. Stattdessen gibt es eine Funktion <code>before</code> :</p>
<p><a href="http://www.cplusplus.com/reference/std/typeinfo/type_info/" rel="nofollow">http://www.cplusplus.com/reference/std/typeinfo/type_info/</a> schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class type_info {
public:
  virtual ~type_info();
  bool operator== (const type_info&amp; rhs) const;
  bool operator!= (const type_info&amp; rhs) const;
  bool before (const type_info&amp; rhs) const;
  const char* name() const;
private:
  type_info (const type_info&amp; rhs);
  type_info&amp; operator= (const type_info&amp; rhs);
};
</code></pre>
</blockquote>
<p>Ich werde aus der Beschreibung nicht so recht schlau, es ist alles sehr schwammig formuliert. Verstanden habe ich, dass der Aufruf der Funktion <code>before</code> für jeden Programmaufruf sogar andere Werte zurückgeben kann. Meine Frage ist, darf ich folgendes machen:</p>
<pre><code class="language-cpp">class type_info_comparer
{
public:
    bool operator()(const std::type_info &amp;a,
                    const std::type_info &amp;b) const
    {
        return a.before(b);
    }
};

std::map&lt;std::type_info,
         /* Insert very complicated type here... */,
         type_info_comparer&gt; my_rtti_map;
</code></pre>
<p>Das Verhalten muss unbedingt portabel sein.</p>
<p>$EDIT: Habe gerade daran herumgebastelt und festgestellt, dass ich sowieso ein Problem bekomme, da der <code>operator= private</code> ist. Muss ich jetzt auch noch einen Wrapper schreiben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285962/std-map-mit-std-type_info-als-schlüssel-darf-ich-das-so-machen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 22:30:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285962.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Apr 2011 20:03:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::map mit std::type_info als Schlüssel, darf ich das so machen? on Sat, 30 Apr 2011 20:07:49 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Ich brauche gerade eine Funktionalität, welche schon fast ein wenig in Richtung Reflection geht (nichts grossartiges, einfach mehr als pures RTTI), und wollte dazu eine <code>std::map</code> mit <code>std::type_info</code> als Schlüssel definieren.</p>
<p>Damit das geht, brauche ich jedoch einen <code>operator&lt;</code> für <code>type_info</code> , welchen es nicht gibt. Stattdessen gibt es eine Funktion <code>before</code> :</p>
<p><a href="http://www.cplusplus.com/reference/std/typeinfo/type_info/" rel="nofollow">http://www.cplusplus.com/reference/std/typeinfo/type_info/</a> schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class type_info {
public:
  virtual ~type_info();
  bool operator== (const type_info&amp; rhs) const;
  bool operator!= (const type_info&amp; rhs) const;
  bool before (const type_info&amp; rhs) const;
  const char* name() const;
private:
  type_info (const type_info&amp; rhs);
  type_info&amp; operator= (const type_info&amp; rhs);
};
</code></pre>
</blockquote>
<p>Ich werde aus der Beschreibung nicht so recht schlau, es ist alles sehr schwammig formuliert. Verstanden habe ich, dass der Aufruf der Funktion <code>before</code> für jeden Programmaufruf sogar andere Werte zurückgeben kann. Meine Frage ist, darf ich folgendes machen:</p>
<pre><code class="language-cpp">class type_info_comparer
{
public:
    bool operator()(const std::type_info &amp;a,
                    const std::type_info &amp;b) const
    {
        return a.before(b);
    }
};

std::map&lt;std::type_info,
         /* Insert very complicated type here... */,
         type_info_comparer&gt; my_rtti_map;
</code></pre>
<p>Das Verhalten muss unbedingt portabel sein.</p>
<p>$EDIT: Habe gerade daran herumgebastelt und festgestellt, dass ich sowieso ein Problem bekomme, da der <code>operator= private</code> ist. Muss ich jetzt auch noch einen Wrapper schreiben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056603</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Sat, 30 Apr 2011 20:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit std::type_info als Schlüssel, darf ich das so machen? on Sat, 30 Apr 2011 21:47:32 GMT]]></title><description><![CDATA[<p>Hier hast du eine fertige Implementierung:<br />
<a href="http://loki-lib.sourceforge.net/html/a00657.html" rel="nofollow">http://loki-lib.sourceforge.net/html/a00657.html</a></p>
<p>Nach meinem Wissen ist sowas absolut erlaubt. Es ist nur nicht spezifiziert, wie die Reihenfolge festgelegt wird.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056633</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 30 Apr 2011 21:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit std::type_info als Schlüssel, darf ich das so machen? on Sun, 01 May 2011 07:21:32 GMT]]></title><description><![CDATA[<p>/rant/ schrieb:</p>
<blockquote>
<p>$EDIT: Habe gerade daran herumgebastelt und festgestellt, dass ich sowieso ein Problem bekomme, da der <code>operator= private</code> ist. Muss ich jetzt auch noch einen Wrapper schreiben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Du kannst keine Objekte von <code>type_info</code> in Containern abspeichern, nur Zeiger auf <code>const</code> . Oder du machst es komfortabel, indem du einen Wrapper mit Wertsemantik benutzt, siehe dazu Draveres Link.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056682</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 01 May 2011 07:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit std::type_info als Schlüssel, darf ich das so machen? on Sun, 01 May 2011 11:54:43 GMT]]></title><description><![CDATA[<p>Danke, habe jetzt einen Wrapper, mit welchem ich das so machen kann.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056761</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Sun, 01 May 2011 11:54:43 GMT</pubDate></item></channel></rss>