<?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[boost signals &amp;amp; Argumentliste]]></title><description><![CDATA[<p>Moin,</p>
<p>ich schreibe momentan eine Wrapperklasse für die Signals aus der Boost-Bibliothek und habe ein Problem damit, für den Aufruf der Slots die richtige Anzahl der Parameter für meine Wrappermethode zu setzen.</p>
<p>Beispiel für die Nutzung der signals:</p>
<pre><code class="language-cpp">struct A{
      void operator()(int,float){
            //do something;
      }
}a;

boost::signal&lt;void (int,float)&gt; s;
s.connect(a);  
s(4,4.5);   // Aufruf der verbundenen Slots
</code></pre>
<p>Nun angenommen, ich wollte den Aufruf des ()-Operators der Signal-Klasse durch eine Methode - nennen wir sie mal &quot;send&quot; - meiner Klasse &quot;wrappen&quot;; wie stelle ich es an, dass send die gleichen Parameter annimmt, wie der ()-operator?</p>
<p>Ich habe zuvor schonmal kurz in die Signals-Doku geschaut und folgendes gefunden:</p>
<pre><code class="language-cpp">// Wir sind in der signal-Klasse

// static constants
  static const int arity = N;  // The number of arguments taken by the signal.

  // member classes/structs/unions
  template&lt;unsigned n&gt; 
  class arg {
  public:
    // types
    typedef Tn type;  // The type of the signal's (n+1)th argument
  };
</code></pre>
<p>Irgendwie baut die signal-Klasse die Funktionssignatur also schon auseinander und stellt die Argumenttypen über</p>
<pre><code class="language-cpp">boost::signal&lt;void (int,float)&gt;::arg&lt;0&gt;   // int
boost::signal&lt;void (int,float)&gt;::arg&lt;1&gt;   // float
</code></pre>
<p>nach außen hin zur Verfügung.</p>
<p>Ich weiß jetzt nur nicht, wie ich dies dazu nutzen kann, meiner Methode send die gleiche Argumentliste zur Verfügung zu stellen, wie dem ()-operator. Geht das und wenn ja, wie stelle ich das an?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262765/boost-signals-amp-argumentliste</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 11:13:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262765.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Mar 2010 00:21:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost signals &amp;amp; Argumentliste on Thu, 11 Mar 2010 00:21:49 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich schreibe momentan eine Wrapperklasse für die Signals aus der Boost-Bibliothek und habe ein Problem damit, für den Aufruf der Slots die richtige Anzahl der Parameter für meine Wrappermethode zu setzen.</p>
<p>Beispiel für die Nutzung der signals:</p>
<pre><code class="language-cpp">struct A{
      void operator()(int,float){
            //do something;
      }
}a;

boost::signal&lt;void (int,float)&gt; s;
s.connect(a);  
s(4,4.5);   // Aufruf der verbundenen Slots
</code></pre>
<p>Nun angenommen, ich wollte den Aufruf des ()-Operators der Signal-Klasse durch eine Methode - nennen wir sie mal &quot;send&quot; - meiner Klasse &quot;wrappen&quot;; wie stelle ich es an, dass send die gleichen Parameter annimmt, wie der ()-operator?</p>
<p>Ich habe zuvor schonmal kurz in die Signals-Doku geschaut und folgendes gefunden:</p>
<pre><code class="language-cpp">// Wir sind in der signal-Klasse

// static constants
  static const int arity = N;  // The number of arguments taken by the signal.

  // member classes/structs/unions
  template&lt;unsigned n&gt; 
  class arg {
  public:
    // types
    typedef Tn type;  // The type of the signal's (n+1)th argument
  };
</code></pre>
<p>Irgendwie baut die signal-Klasse die Funktionssignatur also schon auseinander und stellt die Argumenttypen über</p>
<pre><code class="language-cpp">boost::signal&lt;void (int,float)&gt;::arg&lt;0&gt;   // int
boost::signal&lt;void (int,float)&gt;::arg&lt;1&gt;   // float
</code></pre>
<p>nach außen hin zur Verfügung.</p>
<p>Ich weiß jetzt nur nicht, wie ich dies dazu nutzen kann, meiner Methode send die gleiche Argumentliste zur Verfügung zu stellen, wie dem ()-operator. Geht das und wenn ja, wie stelle ich das an?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867277</guid><dc:creator><![CDATA[Matzer]]></dc:creator><pubDate>Thu, 11 Mar 2010 00:21:49 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals &amp;amp; Argumentliste on Thu, 11 Mar 2010 00:46:12 GMT]]></title><description><![CDATA[<p>Ich habe das Problem nicht verstanden. Hast Du schon irgendwo irgendwas von Deiner Wrapper-Klasse gezeigt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867281</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 11 Mar 2010 00:46:12 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals &amp;amp; Argumentliste on Thu, 11 Mar 2010 02:02:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Hast Du schon irgendwo irgendwas von Deiner Wrapper-Klasse gezeigt?</p>
</blockquote>
<p>Dies sollte dem ungefährem Aufbau entsprechen:</p>
<pre><code class="language-cpp">template&lt;typename signature&gt;
class A{
      private:
      boost::signal&lt;signature&gt; s;
      public:

      void send(){     // Hier steckt das Problem
           s();
      }

      // andere Methoden, z.B. die für das connecten der Slots
};

A&lt;void (int)&gt; a;   // send benötigt int als Parameter
A&lt;void (float, bool)&gt; b; // send benötigt float und bool als Parameter
</code></pre>
<p>Wie bereits oben beschrieben, muss send die gleichen Parametertypen akzeptieren wie s(), um diese entsprechend forwarden zu können. Da die Signals-Klasse die übergebene Signatur bereits zerlegt und über</p>
<pre><code class="language-cpp">boost::signal&lt;void (int,float)&gt;::arg&lt;0&gt;   // int
boost::signal&lt;void (int,float)&gt;::arg&lt;1&gt;   // float
boost::signal&lt;void (int,float)&gt;::arity    // 2 (Parameter)
</code></pre>
<p>Informationen über Argumenttypen und Argumentanzahl zur Verfügung stellt, dachte ich, ich könnte diese Informationen nutzen, um mir gleich eine passende Argumentliste für send zu bauen. Geht das und wenn ja wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867288</guid><dc:creator><![CDATA[Matzer]]></dc:creator><pubDate>Thu, 11 Mar 2010 02:02:22 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals &amp;amp; Argumentliste on Thu, 11 Mar 2010 02:23:50 GMT]]></title><description><![CDATA[<p>Stichwort Spezialisierung:</p>
<pre><code class="language-cpp">template&lt;typename FunSig&gt; class foo;

template&lt;typename Ret, typename Arg&gt;
class foo&lt;Ret(Arg)&gt; {
  ...
  boost::signal&lt;Ret(Arg)&gt; s;
  ...
  Ret send(Arg a) const {
    return s(a);
  }
  ...
};
</code></pre>
<p>In C++0x eher so:</p>
<pre><code class="language-cpp">template&lt;typename FunSig&gt; class foo;

template&lt;typename Ret, typename ... Args&gt;
class foo&lt;Ret(Arg)&gt; {
  ...
  boost::signal&lt;Ret(Args...)&gt; s;
  ...
  Ret send(Args ... args) const {
    return s(std::forward&lt;Args&gt;(args)...);
  }
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1867290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867290</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 11 Mar 2010 02:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals &amp;amp; Argumentliste on Thu, 11 Mar 2010 02:26:20 GMT]]></title><description><![CDATA[<p>Upps, es muss natürlich im letzten Beispiel <code>class foo&lt;Ret(Args...)&gt;</code> statt <code>foo&lt;Ret(Arg)&gt;</code> heißen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867291</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 11 Mar 2010 02:26:20 GMT</pubDate></item></channel></rss>