<?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[Funktionspointer dynamisch generieren]]></title><description><![CDATA[<p>Für eine kleine Scriptsprache möchte ich gerne die Möglichkeit bieten, dass Funktionen in der Sprache registriert werden. Dabei wäre die einfachste Möglichkeit natürlich ein Callback dieser Form:</p>
<pre><code>std::vector&lt;std::string&gt; Callback(std::vector&lt;std::string&gt; Args);
</code></pre>
<p>Auf diese Weise kann ich alles ermöglichen. Funktionen mit und ohne Rückgabewert und mit variabler Parameteranzahl.</p>
<p>Allerdings müsste man dann jede Funktion zumindest wrappen, um sie der Scriptsprache zur Verfügung zu stellen:</p>
<pre><code>std::vector&lt;std::string&gt; MyAddFunc(std::vector&lt;std::string&gt; Args)
{
 int x = ToInt(Args[0]);
 int y = ToInt(Args[1]);

 return ToString(x + y);
}
</code></pre>
<p>Stattdessen würde ich in meiner Scriptsprache gerne sowas ermöglichen:</p>
<pre><code>int MyAddFunc(int x, int y)
{
 return x + y;
}
// ...
scriptEngine-&gt;Register(&quot;int int int&quot;, &quot;Add&quot;, MyAddFunc);
</code></pre>
<p>Ich hab schon etwas mit std::function experimentiert, aber wie gerneriere ich dynamisch einen Funktionspointer für MyAddFunc anhand von &quot;int int int&quot; und rufe ihn dann mit den Werten aus dem Script auf?</p>
<p>Ich hab also im \1:</p>
<pre><code>std::vector&lt;std::string&gt; funcArgs;
// fill funcArgs

// Wie rufe ich nun MyAddFunc ahnahnd von &quot;int int int&quot; mit funcArgs auf?
</code></pre>
<p>Ist das mit variadic Templates möglich? Am besten wäre sogar eine Variante ohne, da ich VS 2010 nutze und es dort noch nicht unterstützt wird.</p>
<p>Oder geht das evtl. sogar gar nicht?</p>
<p>Als Typen würde ich ausschließlich int, void und string unterstützen wollen. Alle anderen Funktionen können für die Scriptsprache nicht registriert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313088/funktionspointer-dynamisch-generieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 08:41:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313088.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Jan 2013 15:35:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 15:35:33 GMT]]></title><description><![CDATA[<p>Für eine kleine Scriptsprache möchte ich gerne die Möglichkeit bieten, dass Funktionen in der Sprache registriert werden. Dabei wäre die einfachste Möglichkeit natürlich ein Callback dieser Form:</p>
<pre><code>std::vector&lt;std::string&gt; Callback(std::vector&lt;std::string&gt; Args);
</code></pre>
<p>Auf diese Weise kann ich alles ermöglichen. Funktionen mit und ohne Rückgabewert und mit variabler Parameteranzahl.</p>
<p>Allerdings müsste man dann jede Funktion zumindest wrappen, um sie der Scriptsprache zur Verfügung zu stellen:</p>
<pre><code>std::vector&lt;std::string&gt; MyAddFunc(std::vector&lt;std::string&gt; Args)
{
 int x = ToInt(Args[0]);
 int y = ToInt(Args[1]);

 return ToString(x + y);
}
</code></pre>
<p>Stattdessen würde ich in meiner Scriptsprache gerne sowas ermöglichen:</p>
<pre><code>int MyAddFunc(int x, int y)
{
 return x + y;
}
// ...
scriptEngine-&gt;Register(&quot;int int int&quot;, &quot;Add&quot;, MyAddFunc);
</code></pre>
<p>Ich hab schon etwas mit std::function experimentiert, aber wie gerneriere ich dynamisch einen Funktionspointer für MyAddFunc anhand von &quot;int int int&quot; und rufe ihn dann mit den Werten aus dem Script auf?</p>
<p>Ich hab also im \1:</p>
<pre><code>std::vector&lt;std::string&gt; funcArgs;
// fill funcArgs

// Wie rufe ich nun MyAddFunc ahnahnd von &quot;int int int&quot; mit funcArgs auf?
</code></pre>
<p>Ist das mit variadic Templates möglich? Am besten wäre sogar eine Variante ohne, da ich VS 2010 nutze und es dort noch nicht unterstützt wird.</p>
<p>Oder geht das evtl. sogar gar nicht?</p>
<p>Als Typen würde ich ausschließlich int, void und string unterstützen wollen. Alle anderen Funktionen können für die Scriptsprache nicht registriert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291923</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:35:33 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 15:40:28 GMT]]></title><description><![CDATA[<p>Was spricht dagegen eine bestehende Skriptsprache zu verwenden? Leider laesst sich dein Problem innerhalb eines Forenbeitrages loesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291928</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 15:43:29 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Was spricht dagegen eine bestehende Skriptsprache zu verwenden? Leider laesst sich dein Problem innerhalb eines Forenbeitrages loesen.</p>
</blockquote>
<p>Jetzt weiß ich wieder, was ich unbedingt noch dazuschreiben wollte und leider vergessen habe. Danke. <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>Es handelt sich natürlich um ein Projekt aus reiner Neugier!</p>
<p>Es geht auch nicht um die Scriptsprache selber (die ist schon fertig). Es geht nur um diese Funktionalität, die ich gerne hinzufügen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291932</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:43:29 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 15:47:10 GMT]]></title><description><![CDATA[<p>Also, du kannst Dir aus dem Prototypen der C++-Funktion, die Du binden möchtest, per template-Magie ein Objekt basteln, das die Argumente von Deinem Skriptomaten einliest, in C++-Typen konvertiert und dann den Aufruf startet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291933</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 16:36:11 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Also, du kannst Dir aus dem Prototypen der C++-Funktion, die Du binden möchtest, per template-Magie ein Objekt basteln, das die Argumente von Deinem Skriptomaten einliest, in C++-Typen konvertiert und dann den Aufruf startet.</p>
</blockquote>
<p>Danke! <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="🙂"
    /> Da du die Sprache ja echt gut beherrscht, könntest du mir zumindest eine kleine Anregung geben? Das würd mich nochmal um einiges weiter bringen. <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/2291956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291956</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Mon, 21 Jan 2013 16:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 17:44:08 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass hierfür ganz besonders gut Variadic Templates geeignet wären, mit denen ich aber überhaupt keine Erfahrung habe, weil der Hersteller des Compilers meines Unvertrauens es nicht für nötig erachtet hat, diese zeitig einzureichen.<br />
Daher wendest Du Dich am besten eher an die dynamischen Freunde der Templatemagie hier!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291982</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Jan 2013 17:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 19:59:49 GMT]]></title><description><![CDATA[<p>Ja, das ist echt schade. Habt ihr denn vielleicht eine Idee, wie ich trotzdem an mein Ziel komme? Vielleicht sogar mit einem anderen Ansatz, der aber auch benutzerfreundlich ist? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2292035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292035</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Mon, 21 Jan 2013 19:59:49 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Mon, 21 Jan 2013 20:50:30 GMT]]></title><description><![CDATA[<p>Also, ich denke mir das etwa so:</p>
<pre><code class="language-cpp">#include &lt;complex&gt;
#include &lt;functional&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;stdexcept&gt;
#include &lt;string&gt;
#include &lt;tuple&gt;
#include &lt;type_traits&gt;
#include &lt;vector&gt;

int foo(unsigned x, double y, std::complex&lt;double&gt; z) {
  std::cout &lt;&lt; x &lt;&lt; &quot; - &quot; &lt;&lt; y &lt;&lt; &quot; - &quot; &lt;&lt; z &lt;&lt; '\n';
  return -1;
}

template&lt;typename T&gt;
T from_string(std::string const &amp;s) {
  T result;
  std::istringstream parser(s);

  if(parser &gt;&gt; result) {
    return result;
  }

  throw std::invalid_argument(&quot;Could not convert parameter from string.&quot;);
}

template&lt;typename R, typename... Args&gt;
class string_function {
public:
  typedef R (*function_type)(Args...);

  string_function(function_type func) : func_(func) { }

  std::string operator()(std::vector&lt;std::string&gt; const &amp;str_args) {
    if(str_args.size() != sizeof...(Args)) {
      throw std::invalid_argument(&quot;Number of arguments does not match function signature.&quot;);
    }

    return std::to_string(apply_args(std::integral_constant&lt;bool, sizeof...(Args) == 0&gt;(), str_args));
  }

private:
  template&lt;typename... Args2&gt;
  R apply_args(std::true_type, std::vector&lt;std::string&gt; const &amp;str_args, Args2&amp;&amp;... args2) {
    return func_(args2...);
  }

  template&lt;typename... Args2&gt;
  R apply_args(std::false_type, std::vector&lt;std::string&gt; const &amp;str_args, Args2&amp;&amp;... args2) {
    return apply_args(std::integral_constant&lt;bool, sizeof...(Args2) + 1 == sizeof...(Args)&gt;(),
                      str_args,
                      std::forward&lt;Args2&gt;(args2)...,
                      from_string&lt;typename std::tuple_element&lt;sizeof...(Args2), std::tuple&lt;Args...&gt;&gt;::type&gt;(str_args[sizeof...(Args2)]));
  }

  function_type func_;
};

template&lt;typename R, typename... Args&gt;
std::function&lt;std::string(std::vector&lt;std::string&gt; const &amp;)&gt; make_string_function(R (*func)(Args...)) {
  return string_function&lt;R, Args...&gt; (func);
}

int main() {
  auto sfunc = make_string_function(foo);
  std::vector&lt;std::string&gt; args { &quot;1&quot;, &quot;2.34&quot;, &quot;(5, 6)&quot; };

  std::cout &lt;&lt; sfunc(args) &lt;&lt; '\n';
}
</code></pre>
<p>Für Funktionen ohne Rückgabewert müsstest du dir halt was überlegen und eine entsprechende Überladung hinzufügen; gleiches gilt, wenn du statt einfacher Funktionen auch Funktionsobjekte benutzen können willst (Lambdas beispielsweise). Der Ansatz sollte sich entsprechend erweitern lassen, ggf. stellen sich aber Designfragen (ob die Funktionsobjekte kopier- bzw. movebar sein müssen, wem was gehört etc.). Ist halt Arbeit, sollte aber gehen.</p>
<p>Ohne variadische Templates geht das mit Boost.Preprocessor und viel, viel Gefummel bestimmt auch irgendwie, aber da hab ich wirklich keine Lust drauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292053</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 21 Jan 2013 20:50:30 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Tue, 22 Jan 2013 15:00:46 GMT]]></title><description><![CDATA[<p>Vielen Dank, seldon. Ich möchte mich bei dir an dieser Stelle nochmal ganz herzlichst bedanken. Insbesondere auch deshalb, weil ich weiß, dass es viele Leute gibt, die sich nach dem Posting eines Vorschlags gar nicht mehr melden.</p>
<p><strong>Vielen lieben Dank!</strong></p>
<p>Ich habe den Code noch nicht ausprobieren können (Visual Studio 2010), aber er sieht sehr gut aus und wenn man es etwas auf sich wirken lässt, dann kann man das Konzept dahinter auch verstehen. Darauf kann ich also gut aufbauen.</p>
<p>Vielen Dank! <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/2292316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292316</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Tue, 22 Jan 2013 15:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 08:06:47 GMT]]></title><description><![CDATA[<p>Funcyd schrieb:</p>
<blockquote>
<p>...Ich habe den Code noch nicht ausprobieren können (Visual Studio 2010), aber er sieht sehr gut aus...</p>
</blockquote>
<p>Das kannst du vergessen, selbst der aktuelle MSVC (2012) kann noch keine variadischen Templates, die seldon hier benutzt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292553</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 23 Jan 2013 08:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 09:41:31 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Das kannst du vergessen, selbst der aktuelle MSVC (2012) kann noch keine variadischen Templates, die seldon hier benutzt hat.</p>
</blockquote>
<p>Die November 2012 CTP kanns und spätestens mit dem Update 2 wirds wohl auch production ready sein... <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/2292562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292562</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 23 Jan 2013 09:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 10:16:10 GMT]]></title><description><![CDATA[<p>Die CTP ist &quot;instabil&quot;, bringt keine neue STL mit und ist nicht reif für den produktiven Einsatz.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6496">@dot</a>, hast Du eine Ahnung, für wann update2 anberaumt ist? Auf den MS-Blogs ist einfach nur Funkstille, ich warte sehnsüchtigst -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292574</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 23 Jan 2013 10:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 10:19:56 GMT]]></title><description><![CDATA[<p>Also man kann das ganze auch umsetzen, indem man das Template spezifisch für alle Anzahlen (nicht typen) von Argumenten, die man unterstützen möchte, überlädt.<br />
Ist ziemlich viel Cut&amp;Paste-Arbeit, aber ich halte das immernoch für übersichtlicher als da mit dem Präprozessor rumzuspielen, selbst wenn die MS STL das so macht und sich die Boost-Jünger auch darauf eingeschossen haben. Aber als Lib-Entwickler muss man eben etwas flexibles liefern, sehe ich schon ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292575</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 23 Jan 2013 10:19:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 18:18:35 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Also man kann das ganze auch umsetzen, indem man das Template spezifisch für alle Anzahlen (nicht typen) von Argumenten, die man unterstützen möchte, überlädt.<br />
Ist ziemlich viel Cut&amp;Paste-Arbeit, aber ich halte das immernoch für übersichtlicher als da mit dem Präprozessor rumzuspielen, selbst wenn die MS STL das so macht und sich die Boost-Jünger auch darauf eingeschossen haben. Aber als Lib-Entwickler muss man eben etwas flexibles liefern, sehe ich schon ein.</p>
</blockquote>
<p>Ja, das klingt ganz gut. Ich hab nur ein Problem mit Templates. Wie kann ich eine Klasse realisieren, die eine unterschiedliche Anzahl an Template Argumenten entgegennimmt?</p>
<pre><code>template &lt;typename R, typename Arg1&gt;
class FuncPtr
{
	typedef R (*func_ptr)(Arg1);

	func_ptr myPtr;

public:
	FuncPtr(func_ptr ptr) : myPtr(ptr) { }

	std::string operator()(const StrVec&amp; v)
	{
		return myPtr(FromString&lt;Arg1&gt;(v[0]));
	}
};

template &lt;typename R, typename Arg1&gt;
std::function&lt;std::string(std::vector&lt;std::string&gt; const &amp;)&gt; FormFuncPtr(R (*func)(Arg1))
{
	return FuncPtr&lt;R, Arg1&gt;(func);
}

template &lt;typename R, typename Arg1, typename Arg2&gt;
class FuncPtr
{
	typedef R (*func_ptr)(Arg1, Arg2);

	func_ptr myPtr;

public:
	FuncPtr(func_ptr ptr) : myPtr(ptr) { }

	template &lt;typename R, typename Arg1, typename Arg2&gt;
	std::string operator()(const StrVec&amp; v)
	{
		return myPtr(FromString&lt;Arg1&gt;(v[0]), FromString&lt;Arg2&gt;(v[0]));
	}
};

template &lt;typename R, typename Arg1, typename Arg2&gt;
std::function&lt;std::string(std::vector&lt;std::string&gt; const &amp;)&gt; FormFuncPtr(R (*func)(Arg1, Arg2))
{
	return FuncPtr&lt;R, Arg1, Arg2&gt;(func);
}
</code></pre>
<p>Folgender Code lässt sich nicht kompilieren, da FuncPtr zu viele Template Argumente hat. Wie könnte man das noch lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292734</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Wed, 23 Jan 2013 18:18:35 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 18:22:40 GMT]]></title><description><![CDATA[<p>Wenn ich jeweils eine Variante auskommentiere, dann compiliert es und funktioniert perfekt. Beide zusammen gehen aber nicht, was aber notwendig ist, um unterschiedliche Parameteranzahlen zu unterstützen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292736</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Wed, 23 Jan 2013 18:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 18:38:23 GMT]]></title><description><![CDATA[<p>Variadic Templates:<br />
Du nimmst eine mit ihnen und spezialisierst dann für die anderen Varianten.</p>
<p>Edit: Oh, genau die wolltest du ja vermeiden. Mein Fehler... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2292743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292743</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 23 Jan 2013 18:38:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Wed, 23 Jan 2013 19:30:10 GMT]]></title><description><![CDATA[<p>Anders:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class ScriptCallback;

template&lt; typename Ret &gt;
class ScriptCallback&lt; Ret() &gt;
{
   //...
};

template&lt; typename Ret, typename Arg1 &gt;
class ScriptCallback&lt; Ret(Arg1) &gt;
{
   //...
};

// usw. usf.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2292767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292767</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 23 Jan 2013 19:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 15:42:18 GMT]]></title><description><![CDATA[<p>Super, das ist viel besser, danke! Könntest du mir noch sagen, was dieses Ret(Arg1) genau bewirkt bzw. besser macht? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2293050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293050</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Thu, 24 Jan 2013 15:42:18 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 15:52:52 GMT]]></title><description><![CDATA[<p>Naja, Ret(Arg1) ist der Typ einer Funktion, die Arg1 nimmt unt Ret zurückgibt. Auf diese Art und Weise bekommt man die ganze Signatur in ein Template-Argument und spezialisiert das Template dann für die &quot;Anzahl der Argumente&quot; des einen Template-Arguments.<br />
Dein fehlerhaftes Beispiel zeigte ja deutlich auf, dass jede Spezialisierung eines Templates die gleiche Anzahl von Template-Argumenten benötigt.</p>
<p>So hat man jetzt nicht:</p>
<pre><code class="language-cpp">// achtung fehlerhaft
template&lt; typename Ret, typename Arg1 &gt; struct templ {};
template&lt; typename Ret, typename Arg1, typename Arg2 &gt; struct templ {};
templ&lt; int, float &gt; some;
templ&lt; int, float, double &gt; some2;
</code></pre>
<p>sondern</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
struct templ; // keine default implementierung

template&lt; typename Ret, typename Arg1 &gt;
struct templ&lt; Ret(Arg1) &gt; struct templ {}; // &lt;&lt; immernoch ein Template-Argument

template&lt; typename Ret, typename Arg1, typename Arg2 &gt;
struct templ&lt; Ret(Arg1,Arg2) &gt; struct templ {}; // &lt;&lt; ein Template-Argumenr!

templ&lt;int(float)&gt; some;   // &lt;&lt; 1 -&gt; TEMPLATE &lt;- Argument
templ&lt;int(float,double)&gt; some2; // &lt;&lt; 1 -&gt; TEMPLATE &lt;- Argument
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2293055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293055</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 Jan 2013 15:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 18:25:54 GMT]]></title><description><![CDATA[<p>Alles klar, das macht natürlich so Sinn <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>Jetzt muss ich nur noch schauen, wie ich Funktionen ohne Rückgabewert unterstütze. Da tue ich momentan leider etwas schwer. Na ja, ich probiere mal noch etwas, ansonsten brauche ich wohl ein letztes Mal hilfe. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2293109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293109</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Thu, 24 Jan 2013 18:25:54 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 18:49:00 GMT]]></title><description><![CDATA[<p>Funcyd schrieb:</p>
<blockquote>
<p>Jetzt muss ich nur noch schauen, wie ich Funktionen ohne Rückgabewert unterstütze.</p>
</blockquote>
<p>Du meinst <code>void</code> als Rückgabetyp? Das sollte nicht allzu schwierig werden. Es ist sogar möglich, <code>void</code> -Ausdrücke mit <code>return</code> zurückzugeben. Kann bei generischem Code praktisch sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293123</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 24 Jan 2013 18:49:00 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 19:03:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Funcyd schrieb:</p>
<blockquote>
<p>Jetzt muss ich nur noch schauen, wie ich Funktionen ohne Rückgabewert unterstütze.</p>
</blockquote>
<p>Du meinst <code>void</code> als Rückgabetyp? Das sollte nicht allzu schwierig werden. Es ist sogar möglich, <code>void</code> -Ausdrücke mit <code>return</code> zurückzugeben. Kann bei generischem Code praktisch sein.</p>
</blockquote>
<p>Und vor allem, um Leute zu verwirren. scnr.</p>
<pre><code>return throw 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2293135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293135</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 24 Jan 2013 19:03:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 19:50:22 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Funcyd schrieb:</p>
<blockquote>
<p>Jetzt muss ich nur noch schauen, wie ich Funktionen ohne Rückgabewert unterstütze.</p>
</blockquote>
<p>Du meinst <code>void</code> als Rückgabetyp? Das sollte nicht allzu schwierig werden. Es ist sogar möglich, <code>void</code> -Ausdrücke mit <code>return</code> zurückzugeben. Kann bei generischem Code praktisch sein.</p>
</blockquote>
<p>Ja, genau. So das man eine Callback-Funktion nutzen kann, die nicht std::string, sondern void &quot;zurückgibt&quot;.</p>
<p>Mein aktueller Code sieht so aus. Es klappt auch alles, aber das mit dem void kriege ich nicht auf die Reihe. Mit Templates/Metaprogrammierung hatte ich bisher noch keinen großen Kontakt.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;functional&gt;
#include &lt;vector&gt;

typedef std::vector&lt;std::string&gt; StrVec;

template&lt; typename T &gt;
T FromString(const std::string&amp; s)
{
	T res;

	std::stringstream strm(s);

	strm &gt;&gt; res;

	return res;
}

template&lt; typename T &gt;
class ScriptCallback;

template&lt; typename R &gt;
class ScriptCallback&lt; R() &gt;
{
	typedef R (*callback)();

	callback callback_;

public:
	ScriptCallback(callback callback) : callback_(callback) { }

	std::string operator()(const StrVec&amp; v) const
	{
		return callback_();
	}
};

template &lt; typename R &gt;
std::function&lt;std::string(const StrVec&amp; v)&gt; MakeCallback(R (*func)())
{
    return ScriptCallback&lt;R()&gt;(func);
}

template&lt; typename R, typename A1 &gt;
class ScriptCallback&lt; R(A1) &gt;
{
	typedef R (*callback)(A1);

	callback callback_;

public:
	ScriptCallback(callback callback) : callback_(callback) { }

	std::string ScriptCallback::operator()(const StrVec&amp; v) const
	{
		return callback_(FromString&lt;A1&gt;(v[0]));
	}
};

template &lt; typename R, typename A1 &gt;
std::function&lt;std::string(const StrVec&amp; v)&gt; MakeCallback(R (*func)(A1))
{
    return ScriptCallback&lt;R(A1)&gt;(func);
}

std::string Test()
{
	std::cout &lt;&lt; &quot;!&quot;;

	return &quot;Test&quot;;
}

std::string Test1(int m)
{
	std::cout &lt;&lt; m + 1000;

	return &quot;Test1&quot;;
}

void Empty(int x)
{
	std::cout &lt;&lt; x;
}

int main()
{
	StrVec v;

	v.push_back(&quot;500&quot;);

	auto cb = MakeCallback(Test1);

	cb(v);
}
</code></pre>
<p>Man muss die Zeile:</p>
<pre><code>auto cb = MakeCallback(Test1);
</code></pre>
<p>in</p>
<pre><code>auto cb = MakeCallback(Empty);
</code></pre>
<p>ändern, um eine beispielhafte void-Funktion zu nutzen.</p>
<p>Es lässt sich dann natürlich nicht mehr kompilieren, weil operator() und MakeCallback() natürlich mit return versucht den nicht vorhandenen Rückgabewert zurückzugeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293154</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Thu, 24 Jan 2013 19:50:22 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 19:55:05 GMT]]></title><description><![CDATA[<p>Dann mache doch einfach überall einen Rückgabewert, die eigentlichen voids returnen bool.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293156</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 24 Jan 2013 19:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 19:58:11 GMT]]></title><description><![CDATA[<p>Funcyd schrieb:</p>
<blockquote>
<p>Es lässt sich dann natürlich nicht mehr kompilieren, weil operator() und MakeCallback() natürlich mit return versucht den nicht vorhandenen Rückgabewert zurückzugeben...</p>
</blockquote>
<p>Was genau kompiliert nicht? Wie schon angetönt, sollte das Zurückgeben von <code>void</code> -Ausdrücken unproblematisch sein.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Dann mache doch einfach überall einen Rückgabewert, die eigentlichen voids returnen bool.</p>
</blockquote>
<p>Ne, das verbirgt nur Fehler. Eine <code>void</code> -Funktion hat nichts zurückzugeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293158</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 24 Jan 2013 19:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer dynamisch generieren on Thu, 24 Jan 2013 20:03:31 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Funcyd schrieb:</p>
<blockquote>
<p>Es lässt sich dann natürlich nicht mehr kompilieren, weil operator() und MakeCallback() natürlich mit return versucht den nicht vorhandenen Rückgabewert zurückzugeben...</p>
</blockquote>
<p>Was genau kompiliert nicht? Wie schon angetönt, sollte das Zurückgeben von <code>void</code> -Ausdrücken unproblematisch sein.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Dann mache doch einfach überall einen Rückgabewert, die eigentlichen voids returnen bool.</p>
</blockquote>
<p>Ne, das verbirgt nur Fehler. Eine <code>void</code> -Funktion hat nichts zurückzugeben...</p>
</blockquote>
<p>Der Code so wie er da steht kompiliert. Er kompiliert nur dann nicht, wenn man <code>MakeCallback(Empty);</code> nutzt, also eine Funktion ohne Rückgabewert.</p>
<p>Was du mit der Rückgabe von void-Ausdrücken meinst, weiß ich nicht so genau. Ein Test mit <code>return void;</code> liefert bei mir zumindest Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293161</guid><dc:creator><![CDATA[Funcyd]]></dc:creator><pubDate>Thu, 24 Jan 2013 20:03:31 GMT</pubDate></item></channel></rss>