<?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[@Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate)]]></title><description><![CDATA[<p>Vorweg ein paar Codeschnipsel:</p>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; class CEventConsumerManager
{
   void RegisterEventId(unsigned long);
   void Connect();
   void Push(Eventdata);
};
</code></pre>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; void CEventConsumerManager&lt; EVENT_T &gt; ::RegisterEventID(unsigned long EventID) 
{
    m_EventID_Vec.push_back( EventID );
}
</code></pre>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; void CEventConsumerManager&lt; EVENT_T &gt;::Connect() 
{
    // Melde Dich beim Eventservice für alle ID's an...
    // Ist Implementiert und funktioniert
}
</code></pre>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; void CEventConsumerManager&lt; EVENT_T &gt;::push(const RtecEventComm::EventSet&amp; data) throw( CORBA::SystemException ) 
{
      // Hier bekomme ich die Events vom CORBA Eventservice
      // Ich könnte über E.header.source herausfinden auf welcher ID empfangen wurde

      EVENT_T *pEventData; 

      if( ( E.data.any_value &gt;&gt;= pEventData ) == 0 )
      {
        std::cout &lt;&lt; &quot;Wrong data&quot; &lt;&lt; std::endl;
        continue;
      }                                        

      std::cout &lt;&lt; &quot;Correct data&quot; &lt;&lt; std::endl;

      // Hier rufe ich beim Benutzer meiner Klasse die push auf, um die Daten weiter zu reichen
      if( m_pEventConsumerClient )
      {
        m_pEventConsumerClient-&gt;push( *pEventData );
      }

    }
}
</code></pre>
<p>Der oben erwähnte Code funktioniert. Als Benutzer meiner Template-Klasse kann man sich für mehrere Kanäle (ID's) anmelden, und wird bei Empfang auf den jeweiligen ID's der Daten über Push benachrichtigt. Dies funktioniert allerdings nur für einen Datentypen (EVENT_T).</p>
<p>Ich möchte nun, dass man sich mit einem ConsumerManager Objekt für x Datentypen auf y EventId's einschreiben kann.</p>
<p>Das ich X Datentypen angeben kann, würde ich über Typelists realisieren. Mein Problem ist nun die Zuordnung von Templateparameter (Datentyp) zu ID.</p>
<p>Kleines Beispiel (wie ich es mir wünschen würde):</p>
<pre><code class="language-cpp">CEventConsumerManager&lt; AMPEL_E, MODUS_T, STATUS_S &gt; myManager;

    // ...
    myManager.RegisterEventID(1); // &lt;-- Wie ordne ich diesem Kanal dem Ampel Enum zu?
    myManager.RegisterEventID(20); // &lt;-- z.B. Kanal für MODUS_T typen

    // ...

   myManager.Connect();
</code></pre>
<p>nun möchte ich in meiner CEventConsumerManager&lt; &gt;::push Methode gerne folgendes machen:</p>
<pre><code class="language-cpp">if( E.header.source == ID OF EVENT_T)
      {
           EVENT_T *pEventData; 
           if( ( E.data.any_value &gt;&gt;= pEventData ) == 0 )
           //...
      }
      if(E.header.source == ID OF EVENT_2_T)
      {
        EVENT_2_T *pEventData; 
        if( ( E.data.any_value &gt;&gt;= pEventData ) == 0 )
        //...

      }
</code></pre>
<p>Ich hoffe ihr versteht was ich meine...</p>
<p>Hat jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187927/guru-s-bzw-cstoll-realisierungsproblem-klassentemplate</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 00:15:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187927.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jul 2007 14:29:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Wed, 25 Jul 2007 14:29:17 GMT]]></title><description><![CDATA[<p>Vorweg ein paar Codeschnipsel:</p>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; class CEventConsumerManager
{
   void RegisterEventId(unsigned long);
   void Connect();
   void Push(Eventdata);
};
</code></pre>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; void CEventConsumerManager&lt; EVENT_T &gt; ::RegisterEventID(unsigned long EventID) 
{
    m_EventID_Vec.push_back( EventID );
}
</code></pre>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; void CEventConsumerManager&lt; EVENT_T &gt;::Connect() 
{
    // Melde Dich beim Eventservice für alle ID's an...
    // Ist Implementiert und funktioniert
}
</code></pre>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; void CEventConsumerManager&lt; EVENT_T &gt;::push(const RtecEventComm::EventSet&amp; data) throw( CORBA::SystemException ) 
{
      // Hier bekomme ich die Events vom CORBA Eventservice
      // Ich könnte über E.header.source herausfinden auf welcher ID empfangen wurde

      EVENT_T *pEventData; 

      if( ( E.data.any_value &gt;&gt;= pEventData ) == 0 )
      {
        std::cout &lt;&lt; &quot;Wrong data&quot; &lt;&lt; std::endl;
        continue;
      }                                        

      std::cout &lt;&lt; &quot;Correct data&quot; &lt;&lt; std::endl;

      // Hier rufe ich beim Benutzer meiner Klasse die push auf, um die Daten weiter zu reichen
      if( m_pEventConsumerClient )
      {
        m_pEventConsumerClient-&gt;push( *pEventData );
      }

    }
}
</code></pre>
<p>Der oben erwähnte Code funktioniert. Als Benutzer meiner Template-Klasse kann man sich für mehrere Kanäle (ID's) anmelden, und wird bei Empfang auf den jeweiligen ID's der Daten über Push benachrichtigt. Dies funktioniert allerdings nur für einen Datentypen (EVENT_T).</p>
<p>Ich möchte nun, dass man sich mit einem ConsumerManager Objekt für x Datentypen auf y EventId's einschreiben kann.</p>
<p>Das ich X Datentypen angeben kann, würde ich über Typelists realisieren. Mein Problem ist nun die Zuordnung von Templateparameter (Datentyp) zu ID.</p>
<p>Kleines Beispiel (wie ich es mir wünschen würde):</p>
<pre><code class="language-cpp">CEventConsumerManager&lt; AMPEL_E, MODUS_T, STATUS_S &gt; myManager;

    // ...
    myManager.RegisterEventID(1); // &lt;-- Wie ordne ich diesem Kanal dem Ampel Enum zu?
    myManager.RegisterEventID(20); // &lt;-- z.B. Kanal für MODUS_T typen

    // ...

   myManager.Connect();
</code></pre>
<p>nun möchte ich in meiner CEventConsumerManager&lt; &gt;::push Methode gerne folgendes machen:</p>
<pre><code class="language-cpp">if( E.header.source == ID OF EVENT_T)
      {
           EVENT_T *pEventData; 
           if( ( E.data.any_value &gt;&gt;= pEventData ) == 0 )
           //...
      }
      if(E.header.source == ID OF EVENT_2_T)
      {
        EVENT_2_T *pEventData; 
        if( ( E.data.any_value &gt;&gt;= pEventData ) == 0 )
        //...

      }
</code></pre>
<p>Ich hoffe ihr versteht was ich meine...</p>
<p>Hat jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332362</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Wed, 25 Jul 2007 14:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Wed, 25 Jul 2007 14:32:11 GMT]]></title><description><![CDATA[<p>Klingt für mich ein bisschen so als würdest du das <a href="http://en.wikipedia.org/wiki/Observer_pattern" rel="nofollow">Observer Design Pattern</a> suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332365</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 25 Jul 2007 14:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Wed, 25 Jul 2007 14:51:51 GMT]]></title><description><![CDATA[<p>Nein, es ist ein Observer, allerdings soll ein Observer für mehrere Typen da sein. Das Problem ist, dass ich auf ID 5 Ampel Daten bekomme, auf ID 6 PERSON Daten und auf ID 7 noch was anderes. Nun muss ich das quasi &quot;Notify&quot; (in meinem Fall Push) aufrufen und einen zeiger auf Ampel, Person, etc übergeben.</p>
<p>Meine Frage, wie mache ich die Zuordnung von ID zu Datentypen in meinem Template bekannt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332379</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Wed, 25 Jul 2007 14:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Wed, 25 Jul 2007 15:19:20 GMT]]></title><description><![CDATA[<p>Du willst also alles mit statischer Polymorphie haben? Ich fürchte das würde enorm ausarten.</p>
<p>Was spricht gegen einen normalen Observer ansatz? Ob du Typen oder Messages hast, ist ja egal.</p>
<p>Wenn du nur ein Value2Type haben willst, das geht einfach:</p>
<pre><code class="language-cpp">template&lt;int V&gt;
struct Value2Type;

template&lt;&gt;
struct Value2Type&lt;1&gt; {
  typedef EVENT_A type;
};

template&lt;&gt;
struct Value2Type&lt;2&gt; {
  typedef EVENT_B type;
};
</code></pre>
<p>wobei ich nicht ganz verstehe was du jetzt eigentlich willst. du hast teilweise statische elemente, wie eben diese typlist - willst dann aber woanders über IDs arbeiten - ergo dynamisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332402</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 25 Jul 2007 15:19:20 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Wed, 25 Jul 2007 15:30:36 GMT]]></title><description><![CDATA[<p>Ich will die CORBA-Anbindung für den Benutzer kapseln.</p>
<p>Ich erhalte in meiner Klasse auf einer ID die Werte im CORBA Datentyp any und wollte es dem Benutzer sparen sich mit der Konvertierung des any Types zu beschäftigen. Der Benutzer meiner Klasse hat die Zuordnung zwischen ID und Typen, die ich so gerne hätte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332410</guid><dc:creator><![CDATA[paddy@home]]></dc:creator><pubDate>Wed, 25 Jul 2007 15:30:36 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Thu, 26 Jul 2007 06:52:53 GMT]]></title><description><![CDATA[<p>Ich wollte es heute morgen noch einmal versuchen zu erklären...<br />
Ist irgendwie nicht ganz einfach mein Problem zu beschreiben.</p>
<p>Ich bin gerade dabei eine CORBA Anbindung (wiederverwendbar und projektunabhängig) zu schreiben. Die ganzen ORB Zugriffe, narrow- Befehle, Naming_Service Anbindung, etc. habe ich weit gekapselt bekommen, das jemand eine CORBA Anwendung schreiben kann, der gar kein CORBA kennt sondern nur c++.</p>
<p>Beim Event Service bin ich momentan am scheitern. Die Sendeseite (Eventsupplier) habe ich schon ganz gut hinbekommen, allerdings ist das Problem die Empfängerseite.</p>
<p>Beim Eventservice kann man einen Consumer über Filter mehrere Kanal-ID's zuweisen. Ich bekomme dann in meiner Template-Klasse EventConsumerManager in meine push Methode alle Events vom Eventservice, für die ich mich eingeschrieben habe.</p>
<p>Ich bräuchte eigentlich sowas wie eine Map, die Typen und ID's speichern kann. Sowas gibt's aber nicht.</p>
<p>Ich glaube, dass ich nicht drum herum komme, die Events als allgemeinen Typen (CORBA any, boost any, void*), zusammen mit der Info auf welchem Kanal die Daten kamen, an den Nutzer meiner Klasse weiterzureichen.</p>
<p>Dann kann der Nutzer die Daten in den jeweiligen Typen zurück konvertieren.</p>
<pre><code class="language-cpp">// in push von EventConsumerManager
    if( m_pEventConsumerClient )
    {
        m_pEventConsumerClient-&gt;push( E.data.any_value, E.header.source);
    }
</code></pre>
<p>Solltet ihr noch eine bessere variante haben, lasst es mich wissen.</p>
<p>Gruß Paddy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332712</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Thu, 26 Jul 2007 06:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Thu, 26 Jul 2007 07:23:45 GMT]]></title><description><![CDATA[<p>hola</p>
<p>Paddy82 schrieb:</p>
<blockquote>
<p>Ich bräuchte eigentlich sowas wie eine Map, die Typen und ID's speichern kann. Sowas gibt's aber nicht.</p>
</blockquote>
<p>naja den typ koenntest du eventuell mittels RTTI als string speichern.<br />
hab leider von CORBA null ahnung, weshalb ich aoch nicht ganz genau weiß was da da eigendlich genau damit meinst.<br />
koenntest du eventuell ein minimales beispiel schreiben, wo man sieht was du genau machen willst ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332734</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Thu, 26 Jul 2007 07:23:45 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Thu, 26 Jul 2007 08:02:09 GMT]]></title><description><![CDATA[<p>Das ist die Variante für <strong>einen</strong> Typen.</p>
<pre><code class="language-cpp">template &lt;class EVENT_T&gt; void CEventConsumerManager&lt; EVENT_T &gt;::push(const RtecEventComm::EventSet&amp; data) throw( CORBA::SystemException ) 
{ 
      // Hier bekomme ich die Events vom CORBA Eventservice 
      // Ich könnte über E.header.source herausfinden auf welcher ID empfangen wurde 

      EVENT_T *pEventData; 

      if( ( E.data.any_value &gt;&gt;= pEventData ) == 0 ) 
      { 
        std::cout &lt;&lt; &quot;Wrong data&quot; &lt;&lt; std::endl; 
        continue; 
      }                                         

      std::cout &lt;&lt; &quot;Correct data&quot; &lt;&lt; std::endl; 

      // Hier rufe ich beim Benutzer meiner Klasse die push auf, um die Daten weiter zu reichen 
      if( m_pEventConsumerClient ) 
      { 
        m_pEventConsumerClient-&gt;push( *pEventData ); 
      } 

    } 
}
</code></pre>
<p>Als Pseudo-Code müsste es in etwa so aussehen:</p>
<pre><code class="language-cpp">template &lt;class EVENT_T, EVENT_2_T, ...&gt; void CEventConsumerManager&lt; EVENT_T, EVENT_2_T, ... &gt;::push(const RtecEventComm::EventSet&amp; data) throw( CORBA::SystemException ) 
{
   // hier steht drin, auf welcher Kanal-ID dieser Event übertragen wurde...
   switch(data.header.source)
   {
       // Hier muss ich nachschlagen was für welche angelegt werden soll
       case m_vecOfID_s[0]:
       {
           EVENT_T *pEventData; 
           if( ( data.data.any_value &gt;&gt;= pEventData ) == 0 )
           {
                m_pEventConsumerClient-&gt;push( *pEventData );
           }
           break;
       }
       case m_vecOfID_s[1]:
       {
           EVENT_2_T *pEventData; 
           if( ( data.data.any_value &gt;&gt;= pEventData ) == 0 )
           {
                m_pEventConsumerClient-&gt;push( *pEventData );
           }
           break;
       }
   }
}
</code></pre>
<p>Der Vektor m_vecOfID_s wird durch die RegisterEventID-Methode gefüllt (siehe oben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332758</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Thu, 26 Jul 2007 08:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Thu, 26 Jul 2007 08:56:09 GMT]]></title><description><![CDATA[<p>Etwas Handarbeit wirst du auf jeden Fall haben, wenn du das dynamische System mit dem statischen aus C++ verbinden willst.</p>
<p>Sind die IDs die den Typen entsprechen schon zur Compiletime bekannt? Wenn ja, dann wäre eine ID2Type Struktur, wie Shade vorgeschlagen hat, ein guter Weg.<br />
Etwas komfortabler könnte man es machen indem man eine Typliste benutzt und die Position in dieser der ID entsprechen würde (vorausgesetzt das geht mit den Corba IDs überhaupt).</p>
<p>Ansonsten schau dir mal die boost::mpl an die kann dir deine Arbeit auf jeden Fall erleichtern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332798</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Thu, 26 Jul 2007 08:56:09 GMT</pubDate></item><item><title><![CDATA[Reply to @Guru&#x27;s bzw. CStoll: Realisierungsproblem (Klassentemplate) on Thu, 26 Jul 2007 09:09:41 GMT]]></title><description><![CDATA[<p>Ich habe es jetzt als &quot;normalen&quot; Observer realisiert und übergebe bei der update (push) Methode die Eventdaten in form vom CORBA::any Datentypen, sowie ein long für die ID, auf der das Event angekommen ist.</p>
<p>Nun müssen im push der Benutzers je nach id in die jeweiligen Datentypen konvertiert werden.</p>
<p>Der Nutzer muss zwar konvertieren, allerdings braucht er dann keine template's mehr benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332810</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Thu, 26 Jul 2007 09:09:41 GMT</pubDate></item></channel></rss>