<?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[boost :: remove_const do it youself]]></title><description><![CDATA[<p>Hi@ all</p>
<p>ich habe eine template function: in etwa so:</p>
<pre><code class="language-cpp">template&lt;typename TValue&gt;
void( TValue&amp; val )
{
   //work with TValue AND the non const type of TVal
}
</code></pre>
<p>problem ist jetzt, das ich in der Function nur den Type von TValue kenne, z.b. fuer const int, ist der eben auch const int. Ich brauche aber den non-const typen. In Boost giebt es dafuer remove_const. Leider kommt boost nicht in frage.</p>
<p>ich habe also angefangen meine eigenen kleinen Traits zu schreiben:</p>
<pre><code class="language-cpp">template&lt; typename T, bool bIsConst &gt;
struct TypeContainer
{
	typedef T Type;
};

template&lt;&gt;
struct TypeContainer&lt;const int, false&gt;
{
	typedef int Type;	
};

template&lt;&gt;
struct TypeContainer&lt;const double, false&gt;
{
	typedef double Type;
};

template&lt;&gt;
struct TypeContainer&lt;const std::wstring, false&gt;
{
	typedef std::wstring Type;
};

template&lt; typename T &gt;
struct ConstTraits
{
	enum{ IS_CONST = 0 };
	typedef TypeContainer&lt;T, true&gt;::Type Type;
	typedef TypeContainer&lt;T, false&gt;::Type NonConstType;
};

template&lt;&gt;
struct ConstTraits&lt;const&gt;
{ 
	enum{ IS_CONST = 1 };
	typedef TypeContainer&lt;T, true&gt;::Type Type;
	typedef TypeContainer&lt;T, false&gt;::Type NonConstType;
};
</code></pre>
<p>haesslich ist daran, dass ich den TypeContainer fuer jeden typen implementieren muss (was nicht weiter schlimm ist, weil ich sowieseo nur basic typen unterstuetze), auch wenn es nur 3 Zeilen sind ;). Boost remove_const sieht aber im Vergliech dazu fast noch komplizierter aus (hab mir noch nicht die muehe gemacht da komplett durchzusteigen). Irgendwelche Ideen fuer eine simple elegante loesung?</p>
<p>Sorry fuer das bloede Beispiel am Anfang. Die genauere Erklaerung warum ich das remove_const brauche ist etwas komplizierter und ich wollte erstmal die Abkuerzung versuchen...</p>
<p>Danke und Viele Gruesse aus dem sonnigen Knoxville / Tennessee</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237041/boost-remove_const-do-it-youself</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 14:54:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237041.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Mar 2009 16:26:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 16:26:20 GMT]]></title><description><![CDATA[<p>Hi@ all</p>
<p>ich habe eine template function: in etwa so:</p>
<pre><code class="language-cpp">template&lt;typename TValue&gt;
void( TValue&amp; val )
{
   //work with TValue AND the non const type of TVal
}
</code></pre>
<p>problem ist jetzt, das ich in der Function nur den Type von TValue kenne, z.b. fuer const int, ist der eben auch const int. Ich brauche aber den non-const typen. In Boost giebt es dafuer remove_const. Leider kommt boost nicht in frage.</p>
<p>ich habe also angefangen meine eigenen kleinen Traits zu schreiben:</p>
<pre><code class="language-cpp">template&lt; typename T, bool bIsConst &gt;
struct TypeContainer
{
	typedef T Type;
};

template&lt;&gt;
struct TypeContainer&lt;const int, false&gt;
{
	typedef int Type;	
};

template&lt;&gt;
struct TypeContainer&lt;const double, false&gt;
{
	typedef double Type;
};

template&lt;&gt;
struct TypeContainer&lt;const std::wstring, false&gt;
{
	typedef std::wstring Type;
};

template&lt; typename T &gt;
struct ConstTraits
{
	enum{ IS_CONST = 0 };
	typedef TypeContainer&lt;T, true&gt;::Type Type;
	typedef TypeContainer&lt;T, false&gt;::Type NonConstType;
};

template&lt;&gt;
struct ConstTraits&lt;const&gt;
{ 
	enum{ IS_CONST = 1 };
	typedef TypeContainer&lt;T, true&gt;::Type Type;
	typedef TypeContainer&lt;T, false&gt;::Type NonConstType;
};
</code></pre>
<p>haesslich ist daran, dass ich den TypeContainer fuer jeden typen implementieren muss (was nicht weiter schlimm ist, weil ich sowieseo nur basic typen unterstuetze), auch wenn es nur 3 Zeilen sind ;). Boost remove_const sieht aber im Vergliech dazu fast noch komplizierter aus (hab mir noch nicht die muehe gemacht da komplett durchzusteigen). Irgendwelche Ideen fuer eine simple elegante loesung?</p>
<p>Sorry fuer das bloede Beispiel am Anfang. Die genauere Erklaerung warum ich das remove_const brauche ist etwas komplizierter und ich wollte erstmal die Abkuerzung versuchen...</p>
<p>Danke und Viele Gruesse aus dem sonnigen Knoxville / Tennessee</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1684928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1684928</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Mon, 23 Mar 2009 16:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 16:59:05 GMT]]></title><description><![CDATA[<p>Auf die Schnelle und ohne Spezialfälle:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;typeinfo&gt; 

template&lt;typename T&gt;
struct RemoveConst
{
	typedef T Result;
};

template&lt;typename T&gt;
struct RemoveConst&lt;const T&gt;
{
	typedef T Result;
};

int main() 
{
	std::cout &lt;&lt; typeid(RemoveConst&lt;int&gt;::Result).name() &lt;&lt; std::endl;
	std::cout &lt;&lt; typeid(RemoveConst&lt;const int&gt;::Result).name() &lt;&lt; std::endl;

	std::cin.get();

	return 0;
}
</code></pre>
<p>Aber wieso willst du kein Boost verwenden? Naja...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1684943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1684943</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 23 Mar 2009 16:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 17:04:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber wieso willst du kein Boost verwenden? Naja...</p>
</blockquote>
<p>das hat mit wollen nichts zu tun, &quot;duerfen&quot; waere passender.... <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>Naja, bei uns giebt es einen Tool - Validierungsprozess. D.h. um eine Bibbliothek oder Tool verwenden muss man erst belegen ob es Sinn macht (Endlose Diskussionen/Meetings/Dokumete etc.....).<br />
Auf der Einen Seite ist es Gut, weil es Wildwuchs verhindert, in diesem speziellen Fall nervt es.....</p>
<p>Danke fuer Deinen Schnellschuss, werd mal testen, ob ich das im VS6 hier mit unseren Komilersettings so umsetzen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1684945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1684945</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Mon, 23 Mar 2009 17:04:33 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 17:49:23 GMT]]></title><description><![CDATA[<p>Hi, hab gerade mal schnell im VS6 ausprobiert:</p>
<pre><code class="language-cpp">template&lt; class TValue &gt;
void addValue( TValue&amp; lhs )
{
	typedef RemoveConst&lt;TValue&gt;::Result NonConstType;
	typedef NonConstType &amp; NonConstRefType;

	std::cout &lt;&lt; typeid( NonConstType ).name() &lt;&lt; std::endl;//correct : type is int
	std::cout &lt;&lt; typeid( NonConstRefType ).name() &lt;&lt; std::endl;//strange : type is int const&amp; ....

	NonConstRefType refIValue = const_cast&lt; NonConstRefType &gt;( lhs );
	refIValue = 22;//error lhs is const.....
}

//in main
const int iLhs = 0;
addValue( iLhs );
</code></pre>
<p>erstmal war ich erstaunt, wie gut Dein Beispiel funktioniert hat : ich war mir fast sicher, dass ich das so auch schon probiert habe <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 />
Irgendwie scheint es aber nicht fuer const referenzen zu funktionieren (leider mein Anwendungsfall). Es wundert mich schon, warum der Compiler fuer</p>
<pre><code class="language-cpp">std::cout &lt;&lt; typeid( RemoveConst&lt;const int&amp;&gt;::Result ).name() &lt;&lt; std::endl;//strange : type is int const&amp; ....
</code></pre>
<p>int const&amp; ausspuckt.....</p>
<p>Danke fuer Deine Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1684976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1684976</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Mon, 23 Mar 2009 17:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 17:51:28 GMT]]></title><description><![CDATA[<p>Warum copy 'n pastest du boost::remove_const nicht einfach in dein Projekt, natürlich mit Vermerk, dass du es aus der boost-Bibliothek kopiert hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1684979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1684979</guid><dc:creator><![CDATA[Tippgeber]]></dc:creator><pubDate>Mon, 23 Mar 2009 17:51:28 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 18:12:07 GMT]]></title><description><![CDATA[<p>Tippgeber schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Weil du ungefähr 30 andere boost Dateien dann auch kopieren musst ? Boost Dateien inkludieren wiederrum auch andere Boost Dateien, also viel Spaß?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1684998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1684998</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Mon, 23 Mar 2009 18:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 18:32:30 GMT]]></title><description><![CDATA[<p>dann muesste ich beim code review auch alles erklaeren, darum geht es ja bei einer bibliotheksvalidierung <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>boost::remove_const ist auch alles in allem recht complex: ich war selber ganz ueberrascht....<br />
Ehrlich gesagt kann ich das problem auch anders loesen, aber dann wuerde es zu lasten der const correctness meiner klassen gehen. Mir faellt es halt schwer solche probleme liegen zu lassen.<br />
Ich dachte auch, dass es simpel umzusetzen geht mit der Einschreankung auf standard datentypen (POD + Strings + enums), aber dem is wohl nicht so.....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1685017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685017</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Mon, 23 Mar 2009 18:32:30 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 18:40:23 GMT]]></title><description><![CDATA[<p>TheBigW schrieb:</p>
<blockquote>
<p>Irgendwie scheint es aber nicht fuer const referenzen zu funktionieren (leider mein Anwendungsfall).</p>
</blockquote>
<p>Dann spezialisierst du die Geschichte eben auch für Referenzen und const Referenzen <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/1685019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685019</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 23 Mar 2009 18:40:23 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 19:07:51 GMT]]></title><description><![CDATA[<p>TheBigW schrieb:</p>
<blockquote>
<p>Danke fuer Deinen Schnellschuss, werd mal testen, ob ich das im VS6 hier mit unseren Komilersettings so umsetzen kann.</p>
</blockquote>
<p>Hmmm, die Sache scheint echt hinderlich zu sein, wenn ihr noch den VS6 einsetzt <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>Aber wie pumuckl gesagt hat, probier einfach noch die Spezialiserung auf <code>T const&amp;</code> und <code>T&amp;</code> für Referenzen und jeweils ein <code>typedef T&amp; Result</code> dazu. Könnte funktionieren, sogar auf dem VS6.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1685027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685027</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 23 Mar 2009 19:07:51 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 19:30:40 GMT]]></title><description><![CDATA[<p>VS6 -&gt; ich hasse es : <a href="http://support.microsoft.com/kb/240866#appliesto" rel="nofollow">http://support.microsoft.com/kb/240866#appliesto</a></p>
<p>hatte ganz vergessen: keine partielle spezialisierung!!!<br />
Ich hab gerade mal im Codeblocks ausprobiert, wie schoen das eigentlich funktioniert.<br />
Damit hat sich wohl ein vernuenftige Loesung erledigt, Trotzdem Danke euch allen.</p>
<p>Wie schoen koennte die Welt mit einem Vernuenftigen Kompiler sein.......</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1685036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685036</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Mon, 23 Mar 2009 19:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 19:33:47 GMT]]></title><description><![CDATA[<p>Das sind aber keine partiellen Spezialisierungen <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 />
Meine Spezialisierungen waren alle vollständig.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1685038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685038</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 23 Mar 2009 19:33:47 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 20:32:47 GMT]]></title><description><![CDATA[<p>...aber leider nicht fuer Referenzen im VS6 <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="🙂"
    /> : ich braeuchte eine Spezialierung fuer referenzen:</p>
<pre><code class="language-cpp">//I wonder if this syntax is somehow standard conform????
struct RemoveConst&lt;const &amp;&gt;
{
    typedef T Result;
};
</code></pre>
<p>leider nimmt der compiler die so nicht, auch wenn es sich kompilieren laesst und</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
struct RemoveConst&lt;const T&amp;&gt;...
</code></pre>
<p>laesst sich nicht kompilieren (im VS6 im g++ gehts...), weil C2989, womit ich wieder bei meinem Link mit partieller Spezialisierung waere...</p>
<p>Wie gesagt Dein Beispiel war super und der folgende Tip von pumuckl mit der spezialisierung hat super funktioniert im g++ aber im VS6 leider nicht......</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1685060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685060</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Mon, 23 Mar 2009 20:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 20:47:52 GMT]]></title><description><![CDATA[<p>Wieso benutzt du VS6?!?!? Was 'n das für ein laden wo du arbeitest..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1685074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685074</guid><dc:creator><![CDATA[wtf?!]]></dc:creator><pubDate>Mon, 23 Mar 2009 20:47:52 GMT</pubDate></item><item><title><![CDATA[Reply to boost :: remove_const do it youself on Mon, 23 Mar 2009 21:32:48 GMT]]></title><description><![CDATA[<p>ist 'ne groessere &quot;Firma&quot; ;). Vergleichbar mit den Dilbert comics.... Restriktionen haben halt positive und negative Seiten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1685099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1685099</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Mon, 23 Mar 2009 21:32:48 GMT</pubDate></item></channel></rss>