<?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[Portieren von Delegates aus C# nach C++ HowTo]]></title><description><![CDATA[<p>Hallo ihr,</p>
<p>ich habe gerade einen C# Kurs gehabt. Programmiere aber beruflich eigentlich immer C++. Während des Kurses habe ich delegates kennengelernt und habe da ziemlich einfach folgendes programmiert.</p>
<pre><code>class Program
{
		public delegate double function(double x); // defieniere Delegate
        public static double eval(function f, double x) // auswerte Funktion die eine function als Parameter bekommt
        {
            return f(x); // gibt function an Stelle x zurück
        }
        public static double myFunction(double x) // eigene Implementierung einer Funktion die auf das Delegate(Schablone) passt
        {
            return x;
        }

        static void Main(string[] args)
        {
            function f; // delegate 
            f = new function(Math.Cos); // versehe delegate mit function
            Console.WriteLine(eval(Math.Cos, 0)); // rufe die function in eval direkt auf
            Console.WriteLine(eval(f, 0)); // oder das damit versehene delegate 
            f = new function(myFunction); // mit selbst geschriebener Funktion
            Console.WriteLine(eval(myFunction, 3));
            Console.WriteLine(eval(f, 3));
            Console.ReadKey();
        }
}
</code></pre>
<p>jetzt meine Frage:<br />
ich würde sowas gerne in C++ machen. Ich habe dazu auch das Stroustrup buch bemüht und bin da auf das Kapitel Funktionszeiger gestoßen.<br />
dort steht dann zum Beispiel sowas:</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &quot;Punkt.h&quot;;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;math.h&quot;
using namespace std;

void fehler(string s) // Methode die einen string auf den Bildschirm schreibt
{
	cout &lt;&lt; s &lt;&lt; endl;
}
void (*efct)(string); // Funktionszeiger mit derselben Funktion

int _tmain(int argc, _TCHAR* argv[])
{
	efct = &amp;fehler; // gebe dem Funktionszeiger die Adresse von fehler
	efct(&quot;Hallo&quot;); // rufen den Funktionszeiger mit &quot;Hallo&quot; auf
	return 0;
}
</code></pre>
<p>Das ist auch schön das das klappt nur würde ich ja gerne eine Methode mit variablen Funktionen wie oben in C# gemacht aufrufen.<br />
Also auch das es eine eval Methode gibt die ich mit jeder beliebigen Funktion aufrufen kann (Kreis, Gerade, Polynom gerad n etc.) und diese an der Stelle x auswerten kann. Könnt ihr mir vielleicht Schlagwörter schicken oder einfach Programmiertipps geben oder eine Anleitung. Programmieren würd ichs schon selbst.<br />
Ich danke schonmal</p>
<p>liebe Grüße<br />
matse</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274959/portieren-von-delegates-aus-c-nach-c-howto</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 06:22:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274959.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Oct 2010 08:49:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Portieren von Delegates aus C# nach C++ HowTo on Wed, 06 Oct 2010 08:49:42 GMT]]></title><description><![CDATA[<p>Hallo ihr,</p>
<p>ich habe gerade einen C# Kurs gehabt. Programmiere aber beruflich eigentlich immer C++. Während des Kurses habe ich delegates kennengelernt und habe da ziemlich einfach folgendes programmiert.</p>
<pre><code>class Program
{
		public delegate double function(double x); // defieniere Delegate
        public static double eval(function f, double x) // auswerte Funktion die eine function als Parameter bekommt
        {
            return f(x); // gibt function an Stelle x zurück
        }
        public static double myFunction(double x) // eigene Implementierung einer Funktion die auf das Delegate(Schablone) passt
        {
            return x;
        }

        static void Main(string[] args)
        {
            function f; // delegate 
            f = new function(Math.Cos); // versehe delegate mit function
            Console.WriteLine(eval(Math.Cos, 0)); // rufe die function in eval direkt auf
            Console.WriteLine(eval(f, 0)); // oder das damit versehene delegate 
            f = new function(myFunction); // mit selbst geschriebener Funktion
            Console.WriteLine(eval(myFunction, 3));
            Console.WriteLine(eval(f, 3));
            Console.ReadKey();
        }
}
</code></pre>
<p>jetzt meine Frage:<br />
ich würde sowas gerne in C++ machen. Ich habe dazu auch das Stroustrup buch bemüht und bin da auf das Kapitel Funktionszeiger gestoßen.<br />
dort steht dann zum Beispiel sowas:</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &quot;Punkt.h&quot;;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;math.h&quot;
using namespace std;

void fehler(string s) // Methode die einen string auf den Bildschirm schreibt
{
	cout &lt;&lt; s &lt;&lt; endl;
}
void (*efct)(string); // Funktionszeiger mit derselben Funktion

int _tmain(int argc, _TCHAR* argv[])
{
	efct = &amp;fehler; // gebe dem Funktionszeiger die Adresse von fehler
	efct(&quot;Hallo&quot;); // rufen den Funktionszeiger mit &quot;Hallo&quot; auf
	return 0;
}
</code></pre>
<p>Das ist auch schön das das klappt nur würde ich ja gerne eine Methode mit variablen Funktionen wie oben in C# gemacht aufrufen.<br />
Also auch das es eine eval Methode gibt die ich mit jeder beliebigen Funktion aufrufen kann (Kreis, Gerade, Polynom gerad n etc.) und diese an der Stelle x auswerten kann. Könnt ihr mir vielleicht Schlagwörter schicken oder einfach Programmiertipps geben oder eine Anleitung. Programmieren würd ichs schon selbst.<br />
Ich danke schonmal</p>
<p>liebe Grüße<br />
matse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1961985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1961985</guid><dc:creator><![CDATA[Matse]]></dc:creator><pubDate>Wed, 06 Oct 2010 08:49:42 GMT</pubDate></item><item><title><![CDATA[Reply to Portieren von Delegates aus C# nach C++ HowTo on Wed, 06 Oct 2010 09:31:26 GMT]]></title><description><![CDATA[<p>Du solltest mal einen Blick auf die <a href="http://www.boost.org" rel="nofollow">boost Bibliotheken</a> werfen, da gibt es z.B. boost::function, das sowas erschlagen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962000</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 06 Oct 2010 09:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Portieren von Delegates aus C# nach C++ HowTo on Wed, 06 Oct 2010 11:51:51 GMT]]></title><description><![CDATA[<p>Oder auch std::tr1::function&lt;..&gt; / std::tr1::bind(..)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962077</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 06 Oct 2010 11:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to Portieren von Delegates aus C# nach C++ HowTo on Wed, 06 Oct 2010 12:56:03 GMT]]></title><description><![CDATA[<p>Hallo,<br />
hier mal ein kleines Beispiel für dich mit tr1-Mitteln, welche im neuen Standard dann einfach im std-namespcae zu finden sind unter functional.<br />
Aber bis es soweit ist:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;tr1/functional&gt;

std::tr1::function&lt;double(double)&gt; delegate; //als templateparameter wird der funktionstyp angegeben, hier eine funktion, die ein double zurückgibt und einen double erwartet
double myFunction(double x) 
{
    return x;
}
int main()
{
 delegate MeineFunktion = &amp;myFunction;
 std::cout &lt;&lt; MeineFunktion(3.14) &lt;&lt; std::endl;
}
</code></pre>
<p>Soweit einmal runtergetippt aus dem Kopf, sollte so aber funktionieren.<br />
Brauchst du noch ein Beispiel, um Klassenmethoden zu binden, sag einfach Bescheid.</p>
<p>Gruß Gate</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962114</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Wed, 06 Oct 2010 12:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to Portieren von Delegates aus C# nach C++ HowTo on Wed, 06 Oct 2010 13:50:25 GMT]]></title><description><![CDATA[<p>In den Beispielen des OPs werden nur freie Funktionen oder statische Elementfunktionen benutzt. Hier reichen Funktionszeiger sogar aus. In C# kann man über &quot;Delegates&quot; auch nicht-statische Elementfunktionen (&quot;Objekt-Methoden&quot;) aufrufen. Das ist sogar der eigentliche Witz an diesen Dingern. Das und noch mehr bekommst Du mit boost/std::tr1 function und boost/std::tr1 bind.</p>
<p>Wenn Du Dich auf freie Funktionen und Elementfunktionen beschränken willst -- also so, wie es bei C# ist, ohne &quot;Funktoren&quot; -- dann kann man das auch mit etwas weniger Overhead erledigen. Man kommt ohne dynamischen Speicher aus und kann dadurch, dass Funktionszeiger als Template-Parameter benutzt werden, Inlining ausnutzen. Das sollte dann mit einem guten Compiler recht flott laufen.</p>
<p>Folgendes kompiliert bei mir mit</p>
<pre><code>g++ -std=c++0x -Wall delegate.cpp
</code></pre>
<p>(Ich nutze hier die experimentellen C++0x Erweiterungen des GCCs, um beliebig viele Funktionsargumente unterstützen zu können.)</p>
<pre><code class="language-cpp">#include &lt;stdexcept&gt;
#include &lt;utility&gt;

template&lt;class Ret, class...Args&gt;
struct wrapper
{
   template&lt;Ret(*FunPtr)(Args...)&gt;
   struct free_fun
   {
      static Ret invoke(void*, Args... args)
      { return FunPtr(std::forward&lt;Args&gt;(args)...); }
   };

   template&lt;class C, Ret (C::*MemFun)(Args...)&gt;
   struct mem_fun_nonconst
   {
      static Ret invoke(void* obj, Args... args)
      { return (static_cast&lt;C*&gt;(obj)-&gt;*MemFun)(std::forward&lt;Args&gt;(args)...); }
   };

   template&lt;class C, Ret (C::*MemFun)(Args...) const&gt;
   struct mem_fun_const
   {
      static Ret invoke(void* obj, Args... args)
      { return (static_cast&lt;C const*&gt;(obj)-&gt;*MemFun)(std::forward&lt;Args&gt;(args)...); }
   };
};

class bad_function_call : public std::logic_error
{
public:
  bad_function_call()
  : logic_error(&quot;bad function call&quot;) {}
};

template&lt;typename FunSig&gt; class delegate;

template&lt;class Ret, class... Args&gt;
class delegate&lt;Ret(Args...)&gt;
{
  Ret (*fun)(void*, Args...);
  void *data;

  static Ret unbound(void*, Args...)
  { throw bad_function_call(); }

public:
  delegate() : fun(&amp;unbound), data(0) {}

  Ret operator()(Args... args) const
  { return fun(data,std::forward&lt;Args&gt;(args)...); }

  template&lt;Ret(*FunPtr)(Args...)&gt;
  void init()
  { 
    typedef typename wrapper&lt;Ret,Args...&gt;::template free_fun&lt;FunPtr&gt; w;
    fun = &amp;w::invoke;
    data = 0;
  }

  template&lt;class C, Ret(C::*MemFun)(Args...)&gt;
  void init(C* obj)
  { 
    typedef typename wrapper&lt;Ret,Args...&gt;::template mem_fun_nonconst&lt;C,MemFun&gt; w;
    fun = &amp;w::invoke;
    data = obj;
  }

  template&lt;class C, Ret(C::*MemFun)(Args...) const&gt;
  void init(C const* obj)
  { 
    typedef typename wrapper&lt;Ret,Args...&gt;::template mem_fun_const&lt;C,MemFun&gt; w;
    fun = &amp;w::invoke;
    data = const_cast&lt;C*&gt;(obj);
  }
};

#include &lt;iostream&gt;

int plus(int a, int b) {return a+b;}
int minus(int a, int b) {return a-b;}

struct foo
{
  int param;
  explicit foo(int p) : param(p) {}
  int dings(int a, int b) const
  { return (a-param)*(b+param); }
};

int main()
{
  delegate&lt;int(int,int)&gt; d;

  d.init&lt;&amp;plus&gt;();
  std::cout &lt;&lt; d(9,5) &lt;&lt; '\n';

  d.init&lt;&amp;minus&gt;();
  std::cout &lt;&lt; d(9,5) &lt;&lt; '\n';

  foo f (2);
  d.init&lt;foo,&amp;foo::dings&gt;(&amp;f);
  std::cout &lt;&lt; d(9,5) &lt;&lt; '\n';
}
</code></pre>
<p>und liefert folgende Ausgabe:</p>
<pre><code>14
4
49
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962139</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 06 Oct 2010 13:50:25 GMT</pubDate></item></channel></rss>