<?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[Interface für generischen Typ]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hab mir im Zusammenhang mit dem Thread &quot;sind templates von template-spezialisierungen möglich?&quot; überlegt, wie man ein Interface für eine Klasse bauen kann, die selbst Objekte verschiedenen Typs verwaltet und wie man dann darauf zugreifen könnte.<br />
Das ganze im Zusammenhang z.B. mit einer Klasse zur Verwaltung von User Settings, also einer Klasse a la boost program_options. Da gibt es eine Methode as&lt;T&gt;() mit der eine Variable aus dem Container geladen werden kann und die eine Exception wirft, falls man den Zugriff über einen falschen Typen versucht.<br />
Wie geht sowas, aufbauend auf den Sprachelementen von C++?</p>
<p>Der Test der Typen könnte ja im Direktzugriff auf die Templateklasse, die die Variablen enthält noch einfach vonstatten gehn, wie z.B. wxSkip im anderen Thread gezeigt hat.<br />
Nur wie pappe ich jetzt diese Templateklasse, die Variablen unterschiedlichen Typs halten kann in einen Container rein? Ich kann für meinen Container schliesslich nicht definieren, dass er Objekte des Typs Templateklasse&lt;T&gt; enthalten soll, da dieses T ja eben unterschiedlich ist. Und wenn ich eine Parentklasse TemplateParent der Templateklasse erstelle, die selber kein Template ist, dann kann ich diese zwar im Container ablegen, aber wie soll dann der Zugriff über as&lt;T&gt;() erfolgen? Schliesslich sind virtuelle template Funktionen nicht möglich?</p>
<p>Ich blick da überhaupt nicht durch wie sowas möglich sein soll.</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281389/interface-für-generischen-typ</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 13:09:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281389.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Jan 2011 21:51:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Interface für generischen Typ on Mon, 31 Jan 2011 21:51:28 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hab mir im Zusammenhang mit dem Thread &quot;sind templates von template-spezialisierungen möglich?&quot; überlegt, wie man ein Interface für eine Klasse bauen kann, die selbst Objekte verschiedenen Typs verwaltet und wie man dann darauf zugreifen könnte.<br />
Das ganze im Zusammenhang z.B. mit einer Klasse zur Verwaltung von User Settings, also einer Klasse a la boost program_options. Da gibt es eine Methode as&lt;T&gt;() mit der eine Variable aus dem Container geladen werden kann und die eine Exception wirft, falls man den Zugriff über einen falschen Typen versucht.<br />
Wie geht sowas, aufbauend auf den Sprachelementen von C++?</p>
<p>Der Test der Typen könnte ja im Direktzugriff auf die Templateklasse, die die Variablen enthält noch einfach vonstatten gehn, wie z.B. wxSkip im anderen Thread gezeigt hat.<br />
Nur wie pappe ich jetzt diese Templateklasse, die Variablen unterschiedlichen Typs halten kann in einen Container rein? Ich kann für meinen Container schliesslich nicht definieren, dass er Objekte des Typs Templateklasse&lt;T&gt; enthalten soll, da dieses T ja eben unterschiedlich ist. Und wenn ich eine Parentklasse TemplateParent der Templateklasse erstelle, die selber kein Template ist, dann kann ich diese zwar im Container ablegen, aber wie soll dann der Zugriff über as&lt;T&gt;() erfolgen? Schliesslich sind virtuelle template Funktionen nicht möglich?</p>
<p>Ich blick da überhaupt nicht durch wie sowas möglich sein soll.</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014965</guid><dc:creator><![CDATA[ccquestions]]></dc:creator><pubDate>Mon, 31 Jan 2011 21:51:28 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Mon, 31 Jan 2011 22:06:31 GMT]]></title><description><![CDATA[<p>void*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014980</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 31 Jan 2011 22:06:31 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Mon, 31 Jan 2011 22:11:51 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>void*</p>
</blockquote>
<p>Und wie überprüfst du dann, um welchen Typen dass es sich handelt? Da hast du doch sämtliche Informationen verloren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014983</guid><dc:creator><![CDATA[ccquestions]]></dc:creator><pubDate>Mon, 31 Jan 2011 22:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 07:48:31 GMT]]></title><description><![CDATA[<p>In deinen Container speichert du Zeiger auf eine &quot;generische&quot; Basisklasse, also so etwas wie einen void-Zeiger. Dann kannst du davon für jeden beliebigen Typen eine Ableitung bilden.<br />
Für eine Optionsliste, würden sich auch einfache Strings anbieten. Zum Speichern, bzw. Einlesen sind sie quasi notwendig, also ist auch eine Konvertierung zwingend. Beim Zugriff kannst du dann den String in einen konkreten Typen umwandeln lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015017</guid><dc:creator><![CDATA[Timothy Lovejoy]]></dc:creator><pubDate>Tue, 01 Feb 2011 07:48:31 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 08:05:27 GMT]]></title><description><![CDATA[<p>ccquestions schrieb:</p>
<blockquote>
<p>Hallo zusammen</p>
<p>Ich hab mir im Zusammenhang mit dem Thread &quot;sind templates von template-spezialisierungen möglich?&quot; überlegt, wie man ein Interface für eine Klasse bauen kann, die selbst Objekte verschiedenen Typs verwaltet und wie man dann darauf zugreifen könnte.</p>
</blockquote>
<p>Sinnvoll geht das nur mit einer Root Class von der alle zuspeichernden Klassen abgeleitet sind. void* hat so seine Nachteile. C++ ist allerdings für ein solches Vorgehen mangels Unterstützung im Laufzeitsystem (es gibt nicht die <strong>eine</strong> Root Class) nicht so gut geeignet. Trotzdem kann man das durch Disziplin erreichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015022</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Tue, 01 Feb 2011 08:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 08:44:57 GMT]]></title><description><![CDATA[<p>Schau dir mal boost.any an:<br />
<a href="http://www.boost.org/doc/libs/1_45_0/doc/html/any.html" rel="nofollow">http://www.boost.org/doc/libs/1_45_0/doc/html/any.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015032</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 01 Feb 2011 08:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 09:50:34 GMT]]></title><description><![CDATA[<p>Ich habe keine Information bei void* verloren, das Objekt ist genauso vorhanden wie vorher. Ich kann mit <code>dynamic_cast</code> auf den gesuchten Typen casten und das Ergebnis pruefen. Nichts anderes wird boost::any machen, es kapselt void* einfach nur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015052</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 01 Feb 2011 09:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 10:11:49 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Ich habe keine Information bei void* verloren, das Objekt ist genauso vorhanden wie vorher. Ich kann mit <code>dynamic_cast</code> auf den gesuchten Typen casten und das Ergebnis pruefen.</p>
</blockquote>
<p>Wirklich? Soviel mir bekannt ist, arbeitet dynamic_cast auf RTTI, void* fehlen aber jegliche Typinformation. Ich würde hier eher ein reinterpret_cast erwarten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015069</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 01 Feb 2011 10:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 10:19:09 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>Ich habe keine Information bei void* verloren, das Objekt ist genauso vorhanden wie vorher. Ich kann mit <code>dynamic_cast</code> auf den gesuchten Typen casten und das Ergebnis pruefen.</p>
</blockquote>
<p>Wirklich? Soviel mir bekannt ist, arbeitet dynamic_cast auf RTTI, void* fehlen aber jegliche Typinformation. Ich würde hier eher ein reinterpret_cast erwarten.</p>
</blockquote>
<p>Lustig. Ich einen static_cast <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>
<p>Die korrekte Antwort hat pumuckl ja schon gesagt: boost::any (bzw etwas äquivalentes)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015073</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 01 Feb 2011 10:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 16:40:13 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Ich habe keine Information bei void* verloren, das Objekt ist genauso vorhanden wie vorher. Ich kann mit <code>dynamic_cast</code> auf den gesuchten Typen casten und das Ergebnis pruefen. Nichts anderes wird boost::any machen, es kapselt void* einfach nur.</p>
</blockquote>
<p>Dass <code>dynamic_cast</code> so nicht funktioniert wurde ja schon geschrieben (void erfüllt die Voraussetzungen für einen dynamic_cast Source Typ nicht).</p>
<p>Eine Möglichkeit sowas wie boost::any zu implementieren ist Funktionszeiger zu verwenden um die Typinformation zu erhalten. D.h. du machst ein Funktionstemplate, das den &quot;any_cast&quot; für &quot;seinen&quot; Typ implementiert, und &quot;seinen&quot; Typ als void* entgegennimmt.</p>
<p>Bei der Zuweisung (wo der Typ ja noch bekannt ist), holst du dir den Zeiger auf die passende Spezialisierung.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void DoSomething(void* obj)
{
    static_cast&lt;T*&gt;(obj)-&gt;DoSomething();
}

template &lt;class T&gt;
void DeleteIt(void* obj)
{
    delete static_cast&lt;T*&gt;(obj);
}

template &lt;class T&gt;
void* CloneIt(void const* obj)
{
    return new T(*static_cast&lt;T const*&gt;(obj));
}

class Foo
{
public:
    template &lt;class T&gt;
    explicit Foo(T t)
        : m_obj(0),
        m_doSomething(&amp;DoSomething&lt;T&gt;),
        m_deleter(&amp;DeleteIt&lt;T&gt;),
        m_cloner(&amp;CloneIt&lt;T&gt;)
    {
        m_obj = new T(t);
    }

    ~Foo()
    {
        m_deleter(m_obj);
    }

    void DoSomething()
    {
        m_doSomething(m_obj);
    }

    Foo(Foo const&amp;);
    Foo&amp; operator = (Foo const&amp;);

    // ...

private:
    void* m_obj;
    void (*m_doSomething)(void*);
    void (*m_deleter)(void*);
    void* (*m_cloner)(void const*);
};
</code></pre>
<p>Die ganzen Zeiger kann man natürlich in einer statischen Instanz einer Templateklasse sammeln.</p>
<p>Oder man verwendet gleich virtuelle Funktionen. Also (non-template) Basisklasse mit den virtuellen Funktionen, Klassen-Template welches diese implementiert und eine statische Instanz von sich selbst enthält. Auf diese statische Instanz holt man sich den Zeiger (als Basisklassen-Zeiger), und über den ruft man die virtuellen Funktionen auf.</p>
<p>Im Prinzip alles das selbe, Variationen in Form und Farbe sozusagen.</p>
<p>EDIT: Fehler im Code beseitigt /EDIT</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015101</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 Feb 2011 16:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 16:35:22 GMT]]></title><description><![CDATA[<p>Man kann void* nicht in dynamic_cast werfen, aber man kann sich beispielsweise das std::type_info-Objekt bei der Zuweisung merken. Mal ganz simpel gestrickt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;
#include &lt;typeinfo&gt;

class rtti_holder {
public:
  template&lt;typename T&gt;
  rtti_holder(T &amp;ref) : ptr_(&amp;ref), tinfo_(typeid(ref)) { }

  template&lt;typename T&gt;
  T &amp;as() {
    if(tinfo_ == typeid(T)) {
      return *static_cast&lt;T*&gt;(ptr_);
    }

    throw std::logic_error(&quot;Falscher Typ&quot;);
  }

private:
  void *ptr_;
  std::type_info const &amp;tinfo_;
};

int main() {
  int i = 2;

  rtti_holder r(i);

  std::cout &lt;&lt; r.as&lt;int &gt;() &lt;&lt; std::endl; // Funktioniert
  std::cout &lt;&lt; r.as&lt;char&gt;() &lt;&lt; std::endl; // Wirft Exception
}
</code></pre>
<p>Wobei natürlich Besitzansprüche gesondert zu regeln sind und im Zweifel auf etwas hinauslaufen, wie es hustbaer vorschlägt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015253</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 01 Feb 2011 16:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 21:23:10 GMT]]></title><description><![CDATA[<p>Type Erasure ist da meiner Meinung nach schöner.</p>
<pre><code class="language-cpp">class any
{
    struct any_impl_base
    {
        virtual ~any_impl_base() {}
    };

    template &lt;typename T&gt;
    struct any_impl : any_impl_base
    {
        T object;
        any_impl(T obj) : object(obj) {}
    };

    any_impl_base* impl;

public:

    template &lt;typename T&gt;
    any(T obj) : impl(new any_impl&lt;T&gt;(obj)) {}

    ~any() { delete impl; }

    template &lt;typename T&gt;
    T&amp; get() { return dynamic_cast&lt;any_impl&lt;T&gt;&amp;&gt;(*impl).object; }

    template &lt;typename T&gt;
    any&amp; operator = (T obj)
    {
        any_impl&lt;T&gt;* ptr = new any_impl&lt;T&gt;(obj);
        delete impl;
        impl = ptr;
        return *this;
    }
};

template &lt;typename T&gt;
T&amp; any_cast(any&amp; a)
{
    return a.get&lt;T&gt;();
}
</code></pre>
<p>Fehlen natürlich noch einige Sachen, aber vom Prinzip her würde ich das so lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015367</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 01 Feb 2011 21:23:10 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Tue, 01 Feb 2011 23:52:01 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Type Erasure ist da meiner Meinung nach schöner.</p>
</blockquote>
<p>Schöner als was?<br />
Sowohl dein Beispiel als auch meins als auch das von seldon machen Type Erasure.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015448</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 Feb 2011 23:52:01 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 15:32:08 GMT]]></title><description><![CDATA[<p>void* hat nicht viel mit Type Erasure zu tun, imo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015666</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 02 Feb 2011 15:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 16:11:07 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>void* hat nicht viel mit Type Erasure zu tun, imo.</p>
</blockquote>
<p>In Java ist das der Standard Weg. Da macht man überall void* wie in seldon Besipiel und nennt sie halt Object-Referenz.</p>
<p>Wieso sollte es also in C++ keine type erasure mehr sein.</p>
<p>(unabhängig jetzt davon welche implementierung hier die schönste ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015686</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 02 Feb 2011 16:11:07 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 17:06:55 GMT]]></title><description><![CDATA[<p>Pis Weg löst das Problem mit Besitzverhältnissen recht elegant, wenn man Kopiersemantik braucht - in diesem Fall muss sowieso an den Heap gegangen werden. Braucht man dagegen Referenzsemantik, scheint mir mein Weg sinnvoller - der virtuelle Destruktor bietet dann keine Vorteile, und man spart sich den Overhead der dynamischen Speicherallokation.</p>
<p>Ungeachtet dessen sehe ich eine gewisse Ironie darin, im Zusammenhang mit dieser Anforderung über die Schönheit der Implementation zu sprechen. Allein die Tatsache, dass man etwas derartiges benötigt, deutet auf wichtigere Designprobleme hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015703</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 02 Feb 2011 17:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 17:19:50 GMT]]></title><description><![CDATA[<p>Vielen Dank, hustbaer, seldon &amp; 314159265358979, eure Antworten haben mich weiter gebracht! Kannte Type Erasure nicht bis anhin.</p>
<p>Wie ist das mit Runtime Type Information in Bezug auf typeid respektive dynamic_cast? Ich habe mich da bis jetzt nicht weiter damit beschäftigt, soweit ich weiss wird aber der Compiler bei beiden Varianten RTTI brauchen, also überall im Code, auch wo gar nicht benötigt zusätzlichen Code einfügen, was dann tendenziell die Performance ziemlich beeinträchtigen kann, typeid noch weniger als dynamic_cast?</p>
<p>Wärs da nicht effizienter, da ich die Typeninformationen nur hier lokal benötige im Container für den generischen Typ in den vom Compiler erstellten Templateklassen, diese selber zu implementieren? Also etwas in der Art wie:</p>
<pre><code class="language-cpp">class TypeInfo
{
 public:
   TypeInfo():Number(++OverallNumber){};

   const int id() const{ return Number; };
 private:
   const int Number;
   static int OverallNumber;
};

int TypeInfo::OverallNumber=0;

class GenericType
{
  class Object
  {
    public:
      virtual const int getTypeId() const =0;
  };

  template&lt;class T&gt;
  class ObjectInstance:public Object
  {
    public:
      ObjectInstance( T _value ):Value(_value),TypeId(*ClassTypeId){};

      T Value;

      const int getTypeId() const { return TypeId.id();};
      static const int typeId(){ return ClassTypeId-&gt;id();};
    private:
      const TypeInfo TypeId;
      static const TypeInfo* const ClassTypeId;
  };

  public:
    template&lt;class T&gt;
    GenericType( T _value ){
      Content=new ObjectInstance&lt;T&gt;( _value );
    };
    ~GenericType() 
    { 
      delete Content; 
    };
    GenericType( const GenericType&amp; _toCopy ){ /*...*/};

    template&lt;class T&gt;
    T&amp; as()
    {
      if( GenericType::ObjectInstance&lt;T&gt;::typeId()==Content-&gt;getTypeId() )
      {
        return static_cast&lt; ObjectInstance&lt;T&gt;* &gt;(Content)-&gt;Value;
      }
      // else throw an exception
    };

  private:
    Object* Content;
};

template&lt;class T&gt;
const TypeInfo* const GenericType::ObjectInstance&lt;T&gt;::ClassTypeId=new TypeInfo();
</code></pre>
<p>?</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Ungeachtet dessen sehe ich eine gewisse Ironie darin, im Zusammenhang mit dieser Anforderung über die Schönheit der Implementation zu sprechen. Allein die Tatsache, dass man etwas derartiges benötigt, deutet auf wichtigere Designprobleme hin.</p>
</blockquote>
<p>Inwiefern? Scheint mir die optimale Methode um veränderbare Settings, die ganz natürlicherweise unterschiedliche Typen haben können in einer gemeinsamen Klasse mit identischem Zugriff speichern zu können?<br />
Btw. Gäbs boost::any wohl kaum, wenn sowas nur benötigt wird, wenn beim Design was schief gelaufen ist..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015708</guid><dc:creator><![CDATA[ccquestions]]></dc:creator><pubDate>Wed, 02 Feb 2011 17:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 19:08:42 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>void* hat nicht viel mit Type Erasure zu tun, imo.</p>
</blockquote>
<p>Wieso nicht?<br />
<code>void*</code> ist IMO die ultimative Type-Erasure, viel weniger &quot;Typ&quot; als <code>void*</code> kann man wohl nicht haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015759</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 02 Feb 2011 19:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 19:15:19 GMT]]></title><description><![CDATA[<p>@ccquestions:<br />
Die Performance spielt bei dem was du da machen willst IMO keine grosse Rolle.<br />
Ich würde dafür auf jeden Fall keinen Type-Info Code selbst schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015763</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 02 Feb 2011 19:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 19:38:18 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>@ccquestions:<br />
Die Performance spielt bei dem was du da machen willst IMO keine grosse Rolle.</p>
</blockquote>
<p>Das ist auch die Frage bezüglich des RTTI: Ich weis nicht wie das genau umgesetzt wird vom Compiler etc. Hab ich da nicht, sobald irgendwo mal der typeid header auftaucht im ganzen Programm das Runtime Type Tracing drin, was ja dann völlig idiotisch wäre, da ichs ja wirklich nur an der Stelle da benötige, notabene mit Typen, die bei der Kompilierung ja eigentlich dem Compiler sogar bekannt sind?</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich würde dafür auf jeden Fall keinen Type-Info Code selbst schreiben.</p>
</blockquote>
<p>Wenn der typeid der std library das schön umsetzt ja klar, auf der anderen Seite reicht mir hier ja eine simple Integer Id ohne das ganze Getöse rundherum völlig aus, also so wie im Code oben funktioniert das perfekt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015773</guid><dc:creator><![CDATA[ccquestions]]></dc:creator><pubDate>Wed, 02 Feb 2011 19:38:18 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 20:37:59 GMT]]></title><description><![CDATA[<p>ccquestions schrieb:</p>
<blockquote>
<p>Hab ich da nicht, sobald irgendwo mal der typeid header auftaucht im ganzen Programm das Runtime Type Tracing drin, was ja dann völlig idiotisch wäre, da ichs ja wirklich nur an der Stelle da benötige, notabene mit Typen, die bei der Kompilierung ja eigentlich dem Compiler sogar bekannt sind?</p>
</blockquote>
<p><strong>R</strong>un<strong>t</strong>ime <strong>t</strong>ype <strong>i</strong>nformation. Das ist ohnehin standardmässig aktiviert (wegen Exceptions) und normalerweise kein Problem.</p>
<p>ccquestions schrieb:</p>
<blockquote>
<p>auf der anderen Seite reicht mir hier ja eine simple Integer Id ohne das ganze Getöse rundherum völlig aus, also so wie im Code oben funktioniert das perfekt...</p>
</blockquote>
<p>Warum selbst basteln, warten und konsistent halten? Hast du Angst vor dem Overhead?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015810</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Feb 2011 20:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Wed, 02 Feb 2011 20:46:47 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p><strong>R</strong>un<strong>t</strong>ime <strong>t</strong>ype <strong>i</strong>nformation.</p>
</blockquote>
<p>Weiss ich danke. Mir gehts nur aufn Sack immer die gleichen Wörter zu verwenden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Grundsatz Nr. 1 beim Schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Das ist ohnehin standardmässig aktiviert (wegen Exceptions) und normalerweise kein Problem.</p>
</blockquote>
<p>Genau hierauf bezog sich die Frage. Das bedeutet also, dass dynamic_cast nur zu Overhead führen kann, weil dann bei Einsatz die ganzen Vererbungen etc durchgegangen werden müssen? Die Informationen sind sowieso alle schon da?</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Warum selbst basteln, warten und konsistent halten? Hast du Angst vor dem Overhead?</p>
</blockquote>
<p>Wenn die Informationen sowieso da sind, ist dies natürlich unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015816</guid><dc:creator><![CDATA[ccquestions]]></dc:creator><pubDate>Wed, 02 Feb 2011 20:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Thu, 03 Feb 2011 02:13:30 GMT]]></title><description><![CDATA[<p>ccquestions schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>@ccquestions:<br />
Die Performance spielt bei dem was du da machen willst IMO keine grosse Rolle.</p>
</blockquote>
<p>Das ist auch die Frage bezüglich des RTTI: Ich weis nicht wie das genau umgesetzt wird vom Compiler etc. Hab ich da nicht, sobald irgendwo mal der typeid header auftaucht im ganzen Programm das Runtime Type Tracing drin, was ja dann völlig idiotisch wäre, da ichs ja wirklich nur an der Stelle da benötige, notabene mit Typen, die bei der Kompilierung ja eigentlich dem Compiler sogar bekannt sind?</p>
</blockquote>
<p>RTTI hat nur dort Performance-Overhead, wo du es auch verwendest. &quot;Getraced&quot; wird da nix. Normalerweise geht das über den VTable-Zeiger, und den muss es sowieso geben, sobald man virtuelle Funktionen verwendet. Da virtuelle Funktionen Voraussetzung für RTTI sind -&gt; kein Overhead. Ausser eben dort wo man Dinge wie typeid() oder dynamic_cast auch wirklich verwendet.</p>
<p>Beide, also typeid und dynamic_cast, können zwar ein gutes Stück langsamer sein als selbstgebastelte Lösungen, nur da das an der Stelle mMn. wirklich vernachlässigt werden kann -&gt; egal.</p>
<p>EDIT: typeid() selbst ist normalerweise sehr sehr schnell. Was ein Bisschen langsam sein kann ist dann der Vergleich zweier type_info Instanzen. Sollte aber auch nur einen spürbaren Impact haben wenn die Typen nicht gleich sind, oder die type_info Instanzen aus unterschiedlichen Programmteilen kommen (z.B. verschiedenen DLLs). /EDIT</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015891</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Feb 2011 02:13:30 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Thu, 03 Feb 2011 03:21:28 GMT]]></title><description><![CDATA[<p>ccquestions schrieb:</p>
<blockquote>
<p>Inwiefern? Scheint mir die optimale Methode um veränderbare Settings, die ganz natürlicherweise unterschiedliche Typen haben können in einer gemeinsamen Klasse mit identischem Zugriff speichern zu können?<br />
Btw. Gäbs boost::any wohl kaum, wenn sowas nur benötigt wird, wenn beim Design was schief gelaufen ist..</p>
</blockquote>
<p>Das Problem ist, dass du auf verschiedene Typen keinen identischen Zugriff bekommst, sofern diese nicht von der selben Basisklasse erben, die das Interface bereitstellt - und in diesem Fall ist die ganze Apparatur eh unnötig.</p>
<p>Überleg dir, wie der benutzende Code am Ende aussehen soll bzw. muss - ich habe Schwierigkeiten, mir ein anderes Vorgehen vorzustellen als &quot;Versuch's mit dem Typ. Funzt nicht? Probier's mit dem nächsten.&quot;, und das ist alles andere als sauber.</p>
<p>Wie man Konfigurationsdaten (wenn ich jetzt richtig verstehe, was du damit vorhast) am sinnvollsten verwaltet, hängt natürlich von der Applikation ab. Meiner Erfahrung nach - aber die ist nicht allumfassend - macht es wenig Sinn, die Konfigurationsdatei in verwursteter Form aber praktisch unverändert vorzuhalten; habe ich beispielsweise eine Einstellung &quot;calculation_backend = foo&quot;, halte ich mir nicht &quot;foo&quot; in einem String vor, um später die damit verbundene Funktion rauszukramen, sondern setze gleich beim Einlesen der Konfiguration einen entsprechenden Funktionszeiger (oder wie auch immer ich das gerade verwalte). Jedenfalls unternehme ich alles sinnvoll mögliche, damit sich kein Stück Client-Code damit rumschlagen muss, den Typ einer Variable zu erraten. Selbst, wenn die Einstellungen zur Laufzeit änderbar sein sollen, macht ein Event-basierter Ansatz da für mein Verständnis mehr Sinn - bring es gleich in eine vernünftig maschinenlesbare Form, und reich die Verarbeitung von Einstellungen nicht nach außen an Code weiter, der sich mit anderen Problemen rumschlagen will.</p>
<p>Ausnahmen gibt es im Wesentlichen da, wo man sich mit...naja, es läuft in gewisser Weise auf Laufzeitprogrammiersprachen raus. Nicht notwendigerweise so hochgestochen wie Script-Engines; ich denke da beispielsweise an Tabellenkalkulationen. Ich fluche zwar jedes mal über XLOPER, wenn ich an einem Excel-Plugin schreibe, aber ich sehe da tatsächlich keine sinnvolle Möglichkeit, das anders zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015896</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 03 Feb 2011 03:21:28 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Thu, 03 Feb 2011 08:32:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>ccquestions schrieb:</p>
<blockquote>
<p>Hab ich da nicht, sobald irgendwo mal der typeid header auftaucht im ganzen Programm das Runtime Type Tracing drin, was ja dann völlig idiotisch wäre, da ichs ja wirklich nur an der Stelle da benötige, notabene mit Typen, die bei der Kompilierung ja eigentlich dem Compiler sogar bekannt sind?</p>
</blockquote>
<p><strong>R</strong>un<strong>t</strong>ime <strong>t</strong>ype <strong>i</strong>nformation. Das ist ohnehin standardmässig aktiviert (wegen Exceptions) und normalerweise kein Problem.</p>
</blockquote>
<p>Ist das wirklich so? Zumindest beim MSVC kann man Exceptions und RTTI getrennt von einander ein- und ausschalten. Mir ist auch nicht klar, was das Eine genau mit dem Anderen zu tun haben soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015928</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 03 Feb 2011 08:32:30 GMT</pubDate></item><item><title><![CDATA[Reply to Interface für generischen Typ on Thu, 03 Feb 2011 09:34:18 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>...Exceptions und RTTI ... Mir ist auch nicht klar, was das Eine genau mit dem Anderen zu tun haben soll.</p>
</blockquote>
<p>Naja wie soll denn die Runtime checken ob ein Catch-Handler passt, wenn sie über die Typen nichts mehr weiss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015954</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Feb 2011 09:34:18 GMT</pubDate></item></channel></rss>