<?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[Unterschiedliche Returntypen (.ini parser)?]]></title><description><![CDATA[<p>Hi!</p>
<p>Wenn ich zB. eine .ini haben will, mit verschiedenen Werten als Zahlen und aber auch Strings, und das ganze über eine einzige Variable ansprechen will, geht das denn zB irgendwie so?:</p>
<pre><code>// .ini Datei
[Group1]
Setting1 = 123
Setting2 = abc
[Group2]
...

// C++ Code
iniFile[&quot;Group1&quot;][&quot;Setting1&quot;]; // Dieser Ausdruck soll ein int sein
iniFile[&quot;Group1&quot;][&quot;Setting2&quot;]; // Dieser Ausdruck soll ein std::string sein
</code></pre>
<p>Wie müsste ich iniFile aufbauen?</p>
<p><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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266622/unterschiedliche-returntypen-ini-parser</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 17:20:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266622.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 May 2010 18:14:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Tue, 11 May 2010 18:14:58 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Wenn ich zB. eine .ini haben will, mit verschiedenen Werten als Zahlen und aber auch Strings, und das ganze über eine einzige Variable ansprechen will, geht das denn zB irgendwie so?:</p>
<pre><code>// .ini Datei
[Group1]
Setting1 = 123
Setting2 = abc
[Group2]
...

// C++ Code
iniFile[&quot;Group1&quot;][&quot;Setting1&quot;]; // Dieser Ausdruck soll ein int sein
iniFile[&quot;Group1&quot;][&quot;Setting2&quot;]; // Dieser Ausdruck soll ein std::string sein
</code></pre>
<p>Wie müsste ich iniFile aufbauen?</p>
<p><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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895913</guid><dc:creator><![CDATA[Noobey]]></dc:creator><pubDate>Tue, 11 May 2010 18:14:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Tue, 11 May 2010 18:26:10 GMT]]></title><description><![CDATA[<p>Das ist nicht möglich. Für eine mögliche Umsetzung könntest du dir den INI-Lader von Boost.PropertyTree anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895916</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 11 May 2010 18:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Tue, 11 May 2010 18:28:32 GMT]]></title><description><![CDATA[<p>Das geht mit komplizierter Template-Bastelei. zum Glück haben das schon fleißige Leute alles erledigt:<br />
<a href="http://www.boost.org/doc/libs/1_43_0/doc/html/variant.html" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/doc/html/variant.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895917</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 11 May 2010 18:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Tue, 11 May 2010 18:34:26 GMT]]></title><description><![CDATA[<p>python nehmen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895918</guid><dc:creator><![CDATA[oder]]></dc:creator><pubDate>Tue, 11 May 2010 18:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Tue, 11 May 2010 18:50:26 GMT]]></title><description><![CDATA[<p>Boost ist mir noch zu viel.<br />
Kann jemand vielleicht ein Minimalbeispiel erstellen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895930</guid><dc:creator><![CDATA[Noobey]]></dc:creator><pubDate>Tue, 11 May 2010 18:50:26 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Tue, 11 May 2010 18:59:53 GMT]]></title><description><![CDATA[<p>So ungefähr könnte man es machen.</p>
<pre><code class="language-cpp">struct INI
{
	typedef std::map&lt;std::string, std::string&gt; Category;
	std::map&lt;std::string, Category&gt; categories;

	template &lt;class T&gt;
	T get(const std::string &amp;cat, const std::string &amp;ent)
	{
		T buf = T();
		std::stringstream ss;
		ss.str(categories[cat][ent]);
		ss &gt;&gt; buf;
		return buf;
	}

	template &lt;class T&gt;
	void set(const std::string &amp;cat, const std::string &amp;ent, const T &amp;value)
	{
		std::stringstream ss;
		ss &lt;&lt; value;
		categories[cat][ent] = ss.str();
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1895933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895933</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 11 May 2010 18:59:53 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Tue, 11 May 2010 19:32:22 GMT]]></title><description><![CDATA[<p>Noobey schrieb:</p>
<blockquote>
<p>Boost ist mir noch zu viel.<br />
Kann jemand vielleicht ein Minimalbeispiel erstellen?</p>
</blockquote>
<p>Die Idee ist eigentlich ,dass du dadurch nicht mehr, sondern weniger Arbeit hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895946</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 11 May 2010 19:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 01:06:08 GMT]]></title><description><![CDATA[<p>Meine Implementation eines .ini-Readers:<br />
<a href="http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.cpp" rel="nofollow">http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.cpp</a><br />
<a href="http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.hpp" rel="nofollow">http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.hpp</a></p>
<p>Vllt hilfts Dir was.. Lizenz aber beachten wenn Du es klaust ;).<br />
Danke.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896015</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 12 May 2010 01:06:08 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 01:48:53 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Meine Implementation eines .ini-Readers:<br />
<a href="http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.cpp" rel="nofollow">http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.cpp</a><br />
<a href="http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.hpp" rel="nofollow">http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLConfigManager.hpp</a></p>
<p>Vllt hilfts Dir was.. Lizenz aber beachten wenn Du es klaust ;).<br />
Danke.<br />
rya.</p>
</blockquote>
<p>Ist sehr viel (überflüssiger) redundanter Code drinne.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896018</guid><dc:creator><![CDATA[jkhjk]]></dc:creator><pubDate>Wed, 12 May 2010 01:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 07:16:12 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>So ungefähr könnte man es machen.<br />
...</p>
</blockquote>
<p>hmmm ... muss aber der (auslesende) Aufrufer nicht trotzdem explizit angeben, welchen Typ er erwartet?<br />
Auch sollte get() noch einen Mechanismus vorsehen, falls der Typ nicht konvertierbar ist (op&gt;&gt; fehlschlägt) ...<br />
... und für &quot;nicht-default-konstruierbare&quot; Typen müsste man auch einiges frickeln (bzw. geeignet spezialisieren).<br />
Aber die Verwendung des op&gt;&gt; finde ich prinzipell gut.<br />
Vielleicht besser mit output-Parameter - dann kann man die automatische Typdeduktion nutzen und hat nicht unbedingt das Problem der def-Konstruktion (es muss nur bereits überhaupt konstruiert sein):</p>
<pre><code class="language-cpp">template &lt;class T&gt;
    bool get(const std::string &amp;cat, const std::string &amp;ent, T&amp; erg)
    {
        std::stringstream ss;
        ss.str(categories[cat][ent]);
        return(ss &gt;&gt; erg);
    }
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896062</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 12 May 2010 07:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 08:01:35 GMT]]></title><description><![CDATA[<p>Kann man meiner Meinung nach noch weiter verbessern:<br />
1. Ich würde beide Methoden anbieten (Simon2 und TyRoXx).<br />
2. Exceptions wären hier für den Fehlschlag besser geeignet. Sowas sollte ja wirklich eine Ausnahme darstellen.</p>
<pre><code class="language-cpp">class ini_bad_type
  : public std::exception
{
private:
  std::string m_category;
  std::string m_entity;
  std::string m_value;

public:
  ini_bad_type(std::string const&amp; cat, std::string const&amp; ent, std::string const&amp; val)
    : m_category(cat)
    , m_entity(ent)
    , m_value(val)
  {
  }

public:
  virtual char const* what() const throw()
  {
    return &quot;ini_bad_type&quot;;
  }

  std::string const&amp; get_category() const
  {
    return m_category;
  }

  std::string const&amp; get_entity() const
  {
    return m_entity;
  }

  std::string const&amp; get_value() const
  {
    return m_value;
  }
};

// irgendwo in einer Klasse dann...

template&lt;typename T&gt;
T&amp; get(std::string const&amp; cat, std::string const&amp; ent, T&amp; result) const
{
  std::string const&amp; value = categories[cat][ent];
  std::istringstream iss(value);

  // Hat jemand einen besseren Vorschlag dafür, wie man prüfen kann,
  // ob alles eingelesen wurde?
  if(iss &gt;&gt; result &amp;&amp; iss.gcount() == value.length())
  {
    return result;
  }

  throw ini_bad_type(cat, ent, value);
}

template&lt;typename T&gt;
T get(std::string const&amp; cat, std::string const&amp; ent) const
{
  T result;
  return get(cat, ent, result);
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896086</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 12 May 2010 08:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 15:51:14 GMT]]></title><description><![CDATA[<p><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="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p><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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896326</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 12 May 2010 15:51:14 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 20:27:11 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">// Hat jemand einen besseren Vorschlag dafür, wie man prüfen kann, 
  // ob alles eingelesen wurde?
</code></pre>
</blockquote>
<p>Guck dir mal <code>boost::lexical_cast</code> an.<br />
<a href="http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm</a></p>
<p>-&gt;</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T get(std::string const&amp; cat, std::string const&amp; ent) const
{
  return boost::lexical_cast&lt;T&gt;(categories[cat][ent]); // throws boost::bad_lexical_cast
}
</code></pre>
<p>Die Optimierung über <code>T&amp;</code> ist zwar grundsätzlich nett, in diesem Fall aber IMO etwas deplaziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896459</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 12 May 2010 20:27:11 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 20:56:52 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Guck dir mal <code>boost::lexical_cast</code> an.<br />
<a href="http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm</a></p>
</blockquote>
<p>Ich kenne <code>boost::lexical_cast</code> schon, verwende es ja auch regelmässig. Wollte aber nicht gleich wieder Boost einsetzen. Und ich kann es aktuell auch nicht nachschauen, wie es <code>boost::lexical_cast</code> macht, da ich hier grad kein Boost habe und nicht das ganze Paket runterladen wollte, nur um das nachzuschauen <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>
<p>Übrigens, in meiner Überprüfung, ob alles gelesen wurde, hat sich ein Fehler eingeschlichen, findet ihn jemand? <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>hustbaer schrieb:</p>
<blockquote>
<p>Die Optimierung über <code>T&amp;</code> ist zwar grundsätzlich nett, in diesem Fall aber IMO etwas deplaziert.</p>
</blockquote>
<p>Was genau meinst du damit? <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=":confused:"
      alt="😕"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896470</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 12 May 2010 20:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 22:00:46 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Übrigens, in meiner Überprüfung, ob alles gelesen wurde, hat sich ein Fehler eingeschlichen, findet ihn jemand? <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>
</blockquote>
<p>Hier:</p>
<pre><code class="language-cpp">public:
  virtual ...
</code></pre>
<p>Sowas geht gar nicht! <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>
<p>(Sorry, aber im Hinblick auf die andere Diskussion war die Frage zu einladend. Nur nicht ernst nehmen ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896486</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 12 May 2010 22:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 22:11:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Übrigens, in meiner Überprüfung, ob alles gelesen wurde, hat sich ein Fehler eingeschlichen, findet ihn jemand? <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>
</blockquote>
<p>Hier:</p>
<pre><code class="language-cpp">public:
  virtual ...
</code></pre>
<p>Sowas geht gar nicht! <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>
<p>(Sorry, aber im Hinblick auf die andere Diskussion war die Frage zu einladend. Nur nicht ernst nehmen ;))</p>
</blockquote>
<p>Das nennt man self-owned. xD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896494</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 12 May 2010 22:11:24 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Wed, 12 May 2010 22:59:37 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Die Optimierung über <code>T&amp;</code> ist zwar grundsätzlich nett, in diesem Fall aber IMO etwas deplaziert.</p>
</blockquote>
<p>Was genau meinst du damit? <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=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>* IMO müsste hier die NRVO greifen.<br />
* Wenn's die nicht packt, dann Move-Semantik (aktuellen Compiler + Std. Library vorausgesetzt).<br />
* Was liest man aus .ini Files, was mit einem stringstream/lexical_cast konvertiert werden müsste? Fallen mir jetzt nur Typen ein die wahnsinnig billig zu kopieren sind (Integers &amp; Floats). Bleiben noch Strings, aber die müsste man nicht konvertieren. Eine Spezialisierung für std::</p>
<p>(w)string würde hier wesentlich mehr bringen als eine Variante mit Output-Parameter.<br />
* Ich würde eine Funktion zum Lesen von Konfigurationsdaten nicht besonders optimieren. Zumindest nicht bevor mir mein Profiler sagt dass ich es tun sollte.<br />
* Wenn man die Funktion wirklich unbedingt optimieren will, dann sollte man IMO den stringstream eliminieren. Was zugegebenermassen viel Arbeit ist. Die ich mir wie schon gesagt nicht antun würde, weil ich so eine Funktion gar nicht optimieren würde <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/1896503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896503</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 12 May 2010 22:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Thu, 13 May 2010 09:10:42 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Und ich kann es aktuell auch nicht nachschauen, wie es <code>boost::lexical_cast</code> macht, da ich hier grad kein Boost habe und nicht das ganze Paket runterladen wollte, nur um das nachzuschauen <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>
</blockquote>
<p>google &quot;boost lexical_cast&quot; -&gt; Zweiter link:<br />
<a href="http://www.boost.org/doc/libs/1_43_0/boost/lexical_cast.hpp" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/boost/lexical_cast.hpp</a></p>
<p>die haben die meisten (oder alle) header lesbar im Netz <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/1896551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896551</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 13 May 2010 09:10:42 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Thu, 13 May 2010 09:32:13 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_43_0/boost/lexical_cast.hpp" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/boost/lexical_cast.hpp</a></p>
</blockquote>
<p>Das ist ein Witz, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896557</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 13 May 2010 09:32:13 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Thu, 13 May 2010 09:47:29 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Das ist ein Witz, oder?</p>
</blockquote>
<p>1213 Zeilen Code für lexikalische Konvertierung? Das kann ich auch nicht nachvollziehen. Mit std::stringstream ist das ein 3-Zeiler?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896561</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Thu, 13 May 2010 09:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Returntypen (.ini parser)? on Thu, 13 May 2010 10:52:14 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Die Optimierung über <code>T&amp;</code> ist zwar grundsätzlich nett, in diesem Fall aber IMO etwas deplaziert.</p>
</blockquote>
<p>Was genau meinst du damit? <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=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>* IMO müsste hier die NRVO greifen.<br />
* Wenn's die nicht packt, dann Move-Semantik (aktuellen Compiler + Std. Library vorausgesetzt).<br />
* Was liest man aus .ini Files, was mit einem stringstream/lexical_cast konvertiert werden müsste? Fallen mir jetzt nur Typen ein die wahnsinnig billig zu kopieren sind (Integers &amp; Floats). Bleiben noch Strings, aber die müsste man nicht konvertieren. Eine Spezialisierung für std::</p>
<p>(w)string würde hier wesentlich mehr bringen als eine Variante mit Output-Parameter.<br />
* Ich würde eine Funktion zum Lesen von Konfigurationsdaten nicht besonders optimieren. Zumindest nicht bevor mir mein Profiler sagt dass ich es tun sollte.<br />
* Wenn man die Funktion wirklich unbedingt optimieren will, dann sollte man IMO den stringstream eliminieren. Was zugegebenermassen viel Arbeit ist. Die ich mir wie schon gesagt nicht antun würde, weil ich so eine Funktion gar nicht optimieren würde <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>
</blockquote>
<p>Verstehe ich dich richtig, dass du damit meinst, dass man die ganze Funktion weglassen soll, welche einen dritten Parameter <code>T&amp;</code> hat? Das war mir nämlich noch nicht so ganz klar, ob du meinst, ob man die Funktion weglassen soll oder nur die Referenz entfernen sollte.<br />
Ich habe jedenfalls diese Funktion nicht hingeschrieben, weil ich an irgendeine Optimierung dachte, sondern an nicht triviale Konstruktoren. Ich muss dir aber zustimmen, dass die Chance für solche Typen eher sehr gering 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>
<p>pumuckl schrieb:</p>
<blockquote>
<p>die haben die meisten (oder alle) header lesbar im Netz <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>
</blockquote>
<p>Ok, ok, ich gebe ja zu, ich war nur zu faul <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>
<p>Sie machen es übrigens einfach mit einem zusätzlichen <code>get</code> danach und Überprüfung auf <code>EOF</code> .</p>
<pre><code class="language-cpp">typedef std::istringstream input_stream;
typedef input_stream::traits_type input_traits;

std::istringstream iss;

if(iss &gt;&gt; result &amp;&amp; iss.get() == input_traits.eof())
{
  // Erfolg!
}
</code></pre>
<p>Der Fehler oben war übrigens, dass ich <code>gcount</code> verwendet habe, zum Überprüfen einer formatierten Eingabe. <code>gcount</code> liefert aber nur die Menge der gelesenen Zeichen der letzten unformatierten Eingabe.</p>
<p>otze schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_43_0/boost/lexical_cast.hpp" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/boost/lexical_cast.hpp</a></p>
</blockquote>
<p>Das ist ein Witz, oder?</p>
</blockquote>
<p>Ad aCTa schrieb:</p>
<blockquote>
<p>1213 Zeilen Code für lexikalische Konvertierung? Das kann ich auch nicht nachvollziehen. Mit std::stringstream ist das ein 3-Zeiler?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Schaut euch mal den Code genauer an, statt nur die Anzahl Zeilen zu zählen. Ihr könnt auch gerne mal mit einem Profiler die Geschwindigkeit des 3-Zeilers in einer Funktion mit dem <code>boost::lexical_cast</code> vergleichen. Ich würde mal behaupten aus längst vergangenen Messungen, dass <code>boost::lexical_cast</code> ca. 4 mal schneller ist. Die haben zahlreiche Optimierungen vorgenommen. Wenn man sogar genau hinschaut, so wird bei Standardtypen (double, float, int, usw.) kein <code>std::stringstream</code> verwendet. Nicht mal irgendein IOStream aus der Standardbibliothek, sondern es werden eigene &quot;Streams&quot; verwendet. Der Trick ist, dass für diese Typen die maximale Grösse als Strings ausgerechnet wird und zwar zur Kompilezeit. Danach wird Speicher dafür auf dem Stack geholt und in diesen Speicher dann geschrieben. Somit musste auch eigener Code her, welcher mit dem aktuellen <code>std::local</code> die Zahlen formatiert oder entsprechend einliest <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="😉"
    /><br />
Und beim Cast in einen <code>std::string</code> , da wird dann zum Beispiel gleich der Puffer des <code>std::string</code> genommen, statt noch über einen anderen Puffer zu gehen. usw. usf. Lest euch selber in den Code ein <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>
<p>Grüssli</p>
<p>PS: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>, kann doch nix dafür, wenn der Standard mir das vorschreibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896586</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 13 May 2010 10:52:14 GMT</pubDate></item></channel></rss>