<?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[Automatisches erkennen des Typs bei boost::make_tuple;]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code funktioniert in Visual Studio 2010 nicht:</p>
<pre><code>int dummyFunc()
{
  return 0;
}

typedef function&lt;int(void)&gt; FUNCTYPE; 
map&lt;string, boost::tuple&lt;int, string, FUNCTYPE&gt;&gt; funcs;

funcs[&quot;dummyFunc&quot;] = boost::make_tuple(0, &quot;Dummy-Function&quot;, dummyFunc);
</code></pre>
<p>Es liefert den Fehler:</p>
<blockquote>
<p>Fehler 12 error C2664: 'boost::tuples::detail::non_storeable_type&lt;T&gt;::non_storeable_type(const boost::tuples::detail::non_storeable_type&lt;T&gt; &amp;)': Konvertierung des Parameters 1 von 'int (__cdecl &amp;)(void)' in 'const boost::tuples::detail::non_storeable_type&lt;T&gt; &amp;' nicht möglich c:\lib\boost\boost\tuple\detail\tuple_basic.hpp 376 1 test</p>
</blockquote>
<p>Dagegen kompiliert folgender Code fehlerfrei:</p>
<pre><code>int dummyFunc()
{
  return 0;
}

typedef function&lt;int(void)&gt; FUNCTYPE; 
map&lt;string, boost::tuple&lt;int, string, FUNCTYPE&gt;&gt; funcs;

funcs[&quot;dummyFunc&quot;] = boost::tuple&lt;int, string, FUNCTYPE&gt;(0, &quot;Dummy-Function&quot;, dummyFunc);
</code></pre>
<p>Warum liefert make_tuple den Fehler und das direkte Anlegen des Tuples klappt?</p>
<p>Gruss Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323254/automatisches-erkennen-des-typs-bei-boost-make_tuple</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 06:52:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323254.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Jan 2014 09:52:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Automatisches erkennen des Typs bei boost::make_tuple; on Thu, 23 Jan 2014 09:52:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code funktioniert in Visual Studio 2010 nicht:</p>
<pre><code>int dummyFunc()
{
  return 0;
}

typedef function&lt;int(void)&gt; FUNCTYPE; 
map&lt;string, boost::tuple&lt;int, string, FUNCTYPE&gt;&gt; funcs;

funcs[&quot;dummyFunc&quot;] = boost::make_tuple(0, &quot;Dummy-Function&quot;, dummyFunc);
</code></pre>
<p>Es liefert den Fehler:</p>
<blockquote>
<p>Fehler 12 error C2664: 'boost::tuples::detail::non_storeable_type&lt;T&gt;::non_storeable_type(const boost::tuples::detail::non_storeable_type&lt;T&gt; &amp;)': Konvertierung des Parameters 1 von 'int (__cdecl &amp;)(void)' in 'const boost::tuples::detail::non_storeable_type&lt;T&gt; &amp;' nicht möglich c:\lib\boost\boost\tuple\detail\tuple_basic.hpp 376 1 test</p>
</blockquote>
<p>Dagegen kompiliert folgender Code fehlerfrei:</p>
<pre><code>int dummyFunc()
{
  return 0;
}

typedef function&lt;int(void)&gt; FUNCTYPE; 
map&lt;string, boost::tuple&lt;int, string, FUNCTYPE&gt;&gt; funcs;

funcs[&quot;dummyFunc&quot;] = boost::tuple&lt;int, string, FUNCTYPE&gt;(0, &quot;Dummy-Function&quot;, dummyFunc);
</code></pre>
<p>Warum liefert make_tuple den Fehler und das direkte Anlegen des Tuples klappt?</p>
<p>Gruss Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379128</guid><dc:creator><![CDATA[uwe00]]></dc:creator><pubDate>Thu, 23 Jan 2014 09:52:03 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches erkennen des Typs bei boost::make_tuple; on Thu, 23 Jan 2014 10:20:37 GMT]]></title><description><![CDATA[<p>wie siehts aus wenn du das string-literal explizit in einen std::string castest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379133</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 23 Jan 2014 10:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches erkennen des Typs bei boost::make_tuple; on Thu, 23 Jan 2014 10:23:05 GMT]]></title><description><![CDATA[<p>boost::make_tuple weiß anscheinend nichts mit einem Funktions-Lvalue anzufangen. du kannst ja mal probieren, vor <code>dummyFunc</code> den Adress-Operator zu verwenden, also</p>
<pre><code class="language-cpp">boost::make_tuple(0, &quot;Dummy-Function&quot;, &amp;dummyFunc)
</code></pre>
<p>So oder so erzeugst du ein temporäres Tuple. Um das loszuwerden könntest Du auch schreiben:</p>
<pre><code class="language-cpp">typedef function&lt;int()&gt; func_t;
typedef boost::tuple&lt;int,string,func_t&gt; tup_t;
map&lt;string,tup_t&gt; funcs;

tup_t&amp; tup = funcs[&quot;dummyFunc&quot;]
boost::get&lt;0&gt;(tup) = 0;
boost::get&lt;1&gt;(tup) = &quot;Dummy-Function&quot;;
boost::get&lt;2&gt;(tup) = dummyFunc;
</code></pre>
<p>was sich auch in einer eigenen Funktion verpacken ließe.</p>
<p>Mir ist auch gerade aufgefallen, dass du schon ein C++11 Feature verwendest. Das <code>&gt;&gt;</code> in <code>map&lt;string,boost::tuple&lt;int,string,FUNCTYPE&gt;&gt;</code> ist erst ab C++11 gültig. Um auch C++98/03-kompatibel zu bleiben, müsstest du da ein Leerzeichen einfügen, also <code>&gt; &gt;</code> statt <code>&gt;&gt;</code> . Das hat was mit dem Lexer zu tun, der ein <code>&gt;&gt;</code> wegen der <a href="https://en.wikipedia.org/wiki/Maximal_munch" rel="nofollow">MaxMunch</a>-Regel als Shift-Operator interpretieren würde. Ab C++11 gibt es allerdings auch std::tuple, std::make_tuple, Rvalue-Referenzen und praktische Type Traits. Du könntest Deinen Code ja mal mit std::tuple/make_tuple testen. Das klappt dann vielleicht auch schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379134</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Thu, 23 Jan 2014 10:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches erkennen des Typs bei boost::make_tuple; on Thu, 23 Jan 2014 10:40:27 GMT]]></title><description><![CDATA[<p>kkaw schrieb:</p>
<blockquote>
<p>Mir ist auch gerade aufgefallen, dass du schon ein C++11 Feature verwendest. Das <code>&gt;&gt;</code> in <code>map&lt;string,boost::tuple&lt;int,string,FUNCTYPE&gt;&gt;</code> ist erst ab C++11 gültig.</p>
</blockquote>
<p>Alle relevanten Compiler haben das alerdings schon sehr viel früher unterstützt auch wenn es eigentlich kein gültiges C++ war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379136</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Thu, 23 Jan 2014 10:40:27 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches erkennen des Typs bei boost::make_tuple; on Thu, 23 Jan 2014 10:41:31 GMT]]></title><description><![CDATA[<p>Mit C++11 kann man da richtig auf die K4cke hauen:</p>
<pre><code class="language-cpp">funcs.emplace(std::piecewise_construct,
  std::forward_as_tuple(&quot;dummyFunc&quot;),               // &lt;-- Parameter für Key
  std::forward_as_tuple(0,&quot;Dummy-Func&quot;,&amp;dummyFunc)  // &lt;-- Parameter für Value
);
</code></pre>
<p>Das müsste das <code>pair</code> -Objekt direkt in der <code>map</code> erzeugen. Ist aber ungetestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379137</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Thu, 23 Jan 2014 10:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches erkennen des Typs bei boost::make_tuple; on Thu, 23 Jan 2014 10:46:02 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Alle relevanten Compiler haben das alerdings schon sehr viel früher unterstützt auch wenn es eigentlich kein gültiges C++ war.</p>
</blockquote>
<p>Gegenbeispiel: g++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379139</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Thu, 23 Jan 2014 10:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches erkennen des Typs bei boost::make_tuple; on Thu, 23 Jan 2014 11:04:11 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>@kkaw</p>
<blockquote>
<p>Mir ist auch gerade aufgefallen, dass du schon ein C++11 Feature verwendest. Das <code>&gt;&gt;</code> in <code>map&lt;string,boost::tuple&lt;int,string,FUNCTYPE&gt;&gt;</code> ist erst ab C++11 gültig. Um auch C++98/03-kompatibel zu bleiben, müsstest du da ein Leerzeichen einfügen, also <code>&gt; &gt;</code> statt <code>&gt;&gt;</code> .</p>
</blockquote>
<p>das ist mir klar. Aber Visual Studio 2010 unterstützt teilweise C++11 Features. Ich muss nicht zu C++98/03-kompatibel bleiben.</p>
<blockquote>
<p>boost::make_tuple(0, &quot;Dummy-Function&quot;, &amp;dummyFunc)</p>
</blockquote>
<p>funktioniert!</p>
<p>Gruss Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379142</guid><dc:creator><![CDATA[uwe00]]></dc:creator><pubDate>Thu, 23 Jan 2014 11:04:11 GMT</pubDate></item></channel></rss>