<?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[Mittels std::string zu Funktion gelangen]]></title><description><![CDATA[<p>Heho, ich überlege mir gerade bzw. versuche herauszufinden, wie man es am besten löst eine Zuordnung und Aufrufung von std::string zu einer gewünschten Funktion zu erstellen. Also wie man am besten eine Funktionentabelle aufstellt aus der die entsprechende Funktion herausgefischt wird, eben je nach string(etwa &quot;sin&quot; -&gt; sin()).<br />
Speziell geht es dabei natürlich über Funktionen mit verschiedenen return types oder verschiedenen Argumentenlisten. Derzeit fällt mir dazu nur ein für int und double (return) types separate Listen zu erstellen und dann zu überlegen welche man derzeit benötigt.<br />
Aber wie macht man das am geschicktesten? Vielen Dank für eure Hilfe.</p>
<p>Ps.: Hätte schwören können ich hätte vorhin schonmal das thema eröffnet und der thread wäre verschwunden^^</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305935/mittels-std-string-zu-funktion-gelangen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 12:25:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305935.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Jul 2012 23:24:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Thu, 12 Jul 2012 23:24:45 GMT]]></title><description><![CDATA[<p>Heho, ich überlege mir gerade bzw. versuche herauszufinden, wie man es am besten löst eine Zuordnung und Aufrufung von std::string zu einer gewünschten Funktion zu erstellen. Also wie man am besten eine Funktionentabelle aufstellt aus der die entsprechende Funktion herausgefischt wird, eben je nach string(etwa &quot;sin&quot; -&gt; sin()).<br />
Speziell geht es dabei natürlich über Funktionen mit verschiedenen return types oder verschiedenen Argumentenlisten. Derzeit fällt mir dazu nur ein für int und double (return) types separate Listen zu erstellen und dann zu überlegen welche man derzeit benötigt.<br />
Aber wie macht man das am geschicktesten? Vielen Dank für eure Hilfe.</p>
<p>Ps.: Hätte schwören können ich hätte vorhin schonmal das thema eröffnet und der thread wäre verschwunden^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232318</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Thu, 12 Jul 2012 23:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Thu, 12 Jul 2012 23:39:21 GMT]]></title><description><![CDATA[<p>boost::any wäre eine Möglichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232319</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 12 Jul 2012 23:39:21 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 00:05:16 GMT]]></title><description><![CDATA[<p>Na ja, ne Möglichkeit wäre sowas:</p>
<pre><code class="language-cpp">#include &lt;unordered_map&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;stdexcept&gt;

class blubb
{
  std::unordered_map&lt;std::string, void (*) ()&gt; functions_;

public:
  template &lt;typename R, typename... Args&gt;
  R call(const std::string&amp; name, Args... args)
  {
    auto found = functions_.find(name);

    if (found == functions_.end())
      throw std::runtime_error(&quot;blubb&quot;);

    return reinterpret_cast&lt;R (*) (Args...)&gt;(found-&gt;second)(args...);
  }
  template &lt;typename F&gt;
  void set(std::string name, F f)
  {
    functions_[std::move(name)] = reinterpret_cast&lt;void (*) ()&gt;(f);
  }
};

double add(double a, double b)
{
  return a + b;
}

int main()
{
  blubb b;
  b.set(&quot;add&quot;, add);
  std::cout &lt;&lt; &quot;5 + 3 = &quot; &lt;&lt; b.call&lt;double&gt;(&quot;add&quot;, 5.0, 3.0) &lt;&lt; '\n';
}
</code></pre>
<p>Aber ehrlich gesagt.. super gefährlich und nicht gerade schön. Ich würde eher nach einer komplett anderen Lösung suchen, wenn unterschiedliche maps nicht in Frage kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232321</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Jul 2012 00:05:16 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 00:13:01 GMT]]></title><description><![CDATA[<p>Danke schonmal für die Antworten.<br />
Doch doch, unterschiedliche Maps kommen in Betracht(werds vermutlich auch so machen), aber würde gerne wissen ob es da bessere/andere Standardlösungen gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232322</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Fri, 13 Jul 2012 00:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 01:27:07 GMT]]></title><description><![CDATA[<p>Hmmm, ärgerlich an der std::map variante ist(so wie ich das sehe), das man, auch wenn nur eine vorhanden ist, funktionen mit von anderen abweichender parameterzahl in eine extra std::map packen muss, da sie einen eigenen funktionenzeigertypen benötigen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232323</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Fri, 13 Jul 2012 01:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 03:38:42 GMT]]></title><description><![CDATA[<p>du könntest verschiedene structs als Parameter übergeben in denen dann die Parameter stecken</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232324</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 13 Jul 2012 03:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 07:39:03 GMT]]></title><description><![CDATA[<p>Namenloser324 schrieb:</p>
<blockquote>
<p>Heho, ich überlege mir gerade bzw. versuche herauszufinden, wie man es am besten löst eine Zuordnung und Aufrufung von std::string zu einer gewünschten Funktion zu erstellen.</p>
</blockquote>
<p>Wozu denn eigentlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232334</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 13 Jul 2012 07:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 11:27:02 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Namenloser324 schrieb:</p>
<blockquote>
<p>Heho, ich überlege mir gerade bzw. versuche herauszufinden, wie man es am besten löst eine Zuordnung und Aufrufung von std::string zu einer gewünschten Funktion zu erstellen.</p>
</blockquote>
<p>Wozu denn eigentlich?</p>
</blockquote>
<p>parser von arithmetischen ausdrücken bei denen auch noch einige funktionen aufrufbar sein sollen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232412</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Fri, 13 Jul 2012 11:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 11:40:57 GMT]]></title><description><![CDATA[<p>Schreib deine Funktionen als T(vector&lt;T&gt;), wobei T der Werttyp ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232415</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 13 Jul 2012 11:40:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 11:53:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct value_type
{
	enum Enum
	{
		Integer,
		Float,
		Boolean,
		Nil,
	};
};
typedef value_type::Enum ValueType;

typedef long long Integer;
typedef double Float;
typedef bool Boolean;

struct Value
{
	ValueType type;
	union
	{
		Integer i;
		Float f;
		Boolean b;
	};

	Value();
	Value(Integer i);
	Value(Float f);
	Value(Boolean b);
};

Integer toInteger(const Value &amp;value)
{
	switch (value.type)
	{
	case value_type::Integer: return value.i;
	case value_type::Float: return static_cast&lt;Integer&gt;(value.f);
	case value_type::Boolean: return value.b;
	default: throw std::runtime_error(&quot;Not convertible to integer&quot;);
	}
}

Float toFloat(const Value &amp;value);

typedef std::function&lt;Value (const std::vector&lt;Value&gt; &amp;)&gt; Function;

struct FunctionRegistry
{
	void add(std::string name, Function function);
	Value call(const std::string &amp;name, const std::vector&lt;Value&gt; &amp;arguments) const;
	//impl sollte klar sein

private:

	typedef std::map&lt;std::string, Function&gt; FunctionsByName;

	FunctionsByName m_functionsByName;
};

static void expectArgumentCount(const std::vector&lt;Value&gt; &amp;args, size_t count)
{
	if (args.size() != count)
	{
		throw std::runtime_error(&quot;Wrong argument count&quot;);
	}
}

int main()
{
	FunctionRegistry reg;
	reg.add(&quot;sin&quot;, [](const std::vector&lt;Value&gt; &amp;args) -&gt; Value
	{
		expectArgumentCount(args, 1);
		return Value(
			static_cast&lt;Float&gt;(std::sin(
				toFloat(args[0]))));
	});
	cout &lt;&lt; toFloat(reg.call(&quot;sin&quot;, std::vector&lt;Value&gt;(1, Value(123)))) &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2232421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232421</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 13 Jul 2012 11:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 14:56:05 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Schreib deine Funktionen als T(vector&lt;T&gt;), wobei T der Werttyp ist.</p>
</blockquote>
<p>Gute Idee, der vector ist natürlich elegant.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@TyRoXx</a><br />
wow, vielen dank, muss mir das erstmal ne weile anschauen bis ich da durchsteige <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="🙂"
    /> sehr cool!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232486</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Fri, 13 Jul 2012 14:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 15:26:13 GMT]]></title><description><![CDATA[<p>Ne Frage zum Code von dir TyRoxx:</p>
<p>was genau wird hier gemacht:</p>
<pre><code class="language-cpp">reg.add(&quot;sin&quot;, [](const std::vector&lt;Value&gt; &amp;args) -&gt; Value
    {
        expectArgumentCount(args, 1);
        return Value(
            static_cast&lt;Float&gt;(std::sin(
                toFloat(args[0]))));
    });
</code></pre>
<p>ist da nicht aufruf der funktion mit definition verwechselt?!<br />
und wieso gibt es dort die geschweifte klammer? wird das array initialisiert?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232498</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Fri, 13 Jul 2012 15:26:13 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 15:52:04 GMT]]></title><description><![CDATA[<p>Das ist kein Array, das ist eine Lambadafunktion von C++11. Genaue Syntax am besten selber googeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232506</guid><dc:creator><![CDATA[Jonas OSDever]]></dc:creator><pubDate>Fri, 13 Jul 2012 15:52:04 GMT</pubDate></item><item><title><![CDATA[Reply to Mittels std::string zu Funktion gelangen on Fri, 13 Jul 2012 16:17:56 GMT]]></title><description><![CDATA[<p>Jonas OSDever schrieb:</p>
<blockquote>
<p>Das ist kein Array, das ist eine Lambadafunktion von C++11. Genaue Syntax am besten selber googeln.</p>
</blockquote>
<p>Ah, gut zu wissen, damit habe ich noch gar nicht gearbeitet, danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232517</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Fri, 13 Jul 2012 16:17:56 GMT</pubDate></item></channel></rss>