<?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[uni_cast?]]></title><description><![CDATA[<p>Hi,</p>
<p>gibt es so eine art UNICODE-Cast in C++?</p>
<p>Ich möchte meine Programme in ANSI und in UNICODE-Varianten veröffentlichen, dafür habe ich nun sehr viel mit einem eigenen TEXT-Makro gearbeitet und es funktioniert auch alles einwandfrei! <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>Jedoch gibt es diverse Funktionen die einen char* erwarten und andere wiederum umbedingt einen wchar_t* <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="😞"
    /></p>
<p>jetzt dachte ich mir, da müsste es doch evtl sowas geben?</p>
<pre><code class="language-cpp">dest_datentyp test = uni_cast&lt;dest_datentyp&gt;(source_datentyp);
</code></pre>
<p>Gibt es da soetwas das genau so aufgebaut ist wie die anderen C++ casts? ich habe von Templatedesign leider nicht sehr viel ahnung <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/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/112327/uni_cast</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 05:52:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/112327.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Jun 2005 07:43:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 07:43:42 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>gibt es so eine art UNICODE-Cast in C++?</p>
<p>Ich möchte meine Programme in ANSI und in UNICODE-Varianten veröffentlichen, dafür habe ich nun sehr viel mit einem eigenen TEXT-Makro gearbeitet und es funktioniert auch alles einwandfrei! <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>Jedoch gibt es diverse Funktionen die einen char* erwarten und andere wiederum umbedingt einen wchar_t* <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="😞"
    /></p>
<p>jetzt dachte ich mir, da müsste es doch evtl sowas geben?</p>
<pre><code class="language-cpp">dest_datentyp test = uni_cast&lt;dest_datentyp&gt;(source_datentyp);
</code></pre>
<p>Gibt es da soetwas das genau so aufgebaut ist wie die anderen C++ casts? ich habe von Templatedesign leider nicht sehr viel ahnung <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/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/806997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/806997</guid><dc:creator><![CDATA[&#x27;&#x27;&#x27;]]></dc:creator><pubDate>Sat, 11 Jun 2005 07:43:42 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 09:50:51 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Es gibt was zum konvertieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;locale&gt;
int main()
{
  char str[100] = &quot;Hello World&quot;;
  wchar_t wstr[100];
  std::use_facet&lt; std::ctype&lt;wchar_t&gt; &gt;( std::locale(&quot;C&quot;) ).widen(str,str+100,wstr);
  std::wcout &lt;&lt; wstr &lt;&lt; std::endl;
}
</code></pre>
<p>// Edit: Fixed Typo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/807039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807039</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 11 Jun 2005 09:50:51 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 09:56:51 GMT]]></title><description><![CDATA[<p>die manuelle konvertierung kenn ich, aber wie macht man daraus einen cast? <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="😮"
    /> wie schon gesagt, ich kenn mich mit templates nicht aus und ich glaube das man die dafür braucht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/807046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807046</guid><dc:creator><![CDATA[&#x27;&#x27;&#x27;]]></dc:creator><pubDate>Sat, 11 Jun 2005 09:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 11:28:11 GMT]]></title><description><![CDATA[<p>ich hab mal vor kurzem so einen cast geschrieben, aber das grenzt eher an einen großen hack. ich kopier dir den code mal raus</p>
<pre><code class="language-cpp">#include &lt;locale&gt;
#include &lt;string&gt;

#include &lt;boost/type_traits.hpp&gt;
namespace utility{
	namespace privat{
    //the class Converter chooses the right function whhich does the conversion
		//there are 5 cases which have to be handled different:
		//
		//Type-&gt;AnotherType first uses narrow than widden, dataloss can occur
		//Type-&gt;char uses narrow
		//char-&gt;Type uses widden
		//char-&gt;char no conversion
		//Type-&gt;Type no conversion

		//conversion type-&gt;type
		template&lt;class To,class From&gt;
		struct Converter{

			static std::basic_string&lt;To&gt; convert(const std::basic_string&lt;From&gt;&amp; input){
				return Converter&lt;To,char&gt;::convert(Converter&lt;char,From&gt;::convert(input));
			}

			static To convertChar(From input){
				return Converter&lt;To,char&gt;::convertChar(Converter&lt;char,From&gt;::convertChar(input));
			}
		};

		//conversion char-&gt;type
		template&lt;class To&gt;
		struct Converter&lt;To,char&gt;{
			static std::basic_string&lt;To&gt; convert(const std::string&amp; input){
				To* widen = new To[input.size()];

				std::use_facet&lt;std::ctype&lt;To&gt; &gt; (std::locale()).widen(&amp;*input.begin(), &amp;*input.end(), widen);

				std::basic_string&lt;To&gt; output(widen);
				delete[] widen;

				return output;
			}
			static To convertChar(char input){
				return std::use_facet&lt;std::ctype&lt;To&gt; &gt; (std::locale()).widen(input);
			}
		};

		//conversion type-&gt;char
		template&lt;class From&gt;
		struct Converter&lt;char,From&gt;{
			static std::string convert(const std::basic_string&lt;From&gt;&amp; input){
				char* narrow = new char[input.size()];

				std::use_facet&lt;std::ctype&lt;From&gt; &gt; (std::locale()).narrow(&amp;*input.begin(), &amp;*input.end(), narrow);

				std::string output(narrow);
				delete[] narrow;

				return output;
			}
			static char convertChar(From input){
				return std::use_facet&lt;std::ctype&lt;From&gt; &gt; (std::locale()).narrow(input);
			}
		};

		//when both types are the same, no conversion is needed
		template&lt;class Char&gt;
		struct Converter&lt;Char,Char&gt;{
			static const std::basic_string&lt;Char&gt;&amp; convert(const std::basic_string&lt;Char&gt;&amp; input){
				return input;
			}
			static Char convertChar(Char input){
				return input;
			}
		};
		//specialisation for &lt;char,char&gt; prevents ambigouity
		template&lt;&gt; struct Converter&lt;char,char&gt;{
			static const std::basic_string&lt;char&gt;&amp; convert(const std::basic_string&lt;char&gt;&amp; input){
				return input;
			}
			static char convertChar(char input){
				return input;
			}
		};

		//ConvertHelper has to differ between the 4 possible forms of the
		//template paramter &quot;from&quot;: single sign,pointer,basic_string and char array.
		//Function templates doesnt work here because the compiler cannot
		//differ between them

		//when From is a pointer(cstring),it must be converted into a string
		template&lt;class To,class From,bool&gt;
		struct ConvertHelper{
			typedef std::basic_string&lt;To&gt; returnType;

			static returnType convert(From input){
				//get the unqualified nonpointer type 
				//example const char*-&gt;char
				//this is needed for basic_string
				typedef 
				typename boost::remove_const&lt;
					typename boost::remove_pointer&lt;
						typename boost::remove_const&lt;From&gt;::type
					&gt;::type
				&gt;::type InnerFrom;

				std::basic_string&lt;InnerFrom&gt; str(input);

				return Converter&lt;To,InnerFrom&gt;::convert(str);
			}				
		};

		//From is a normal char
		template&lt;class To,class From&gt;
		struct ConvertHelper&lt;To,From,false&gt;{

			typedef To returnType;

			static returnType convert(From str){
				return Converter&lt;To,From&gt;::convertChar(str);
			}				
		};

		//From is a std::basic_string
		template&lt;class To,class From&gt;
		struct ConvertHelper&lt;To,std::basic_string&lt;From&gt;,false&gt;{

			typedef std::basic_string&lt;To&gt; returnType; 

			static returnType convert(const std::basic_string&lt;From&gt;&amp; str){
				return Converter&lt;To,From&gt;::convert(str);
			}
		};

		//from is a char array
		template&lt;class To,class From,int i&gt;
		struct ConvertHelper&lt;To,From[i],false&gt;{

			typedef std::basic_string&lt;To&gt; returnType;

			typedef typename boost::remove_const&lt;From&gt;::type InnerFrom;

			static returnType convert(const std::basic_string&lt;InnerFrom&gt;&amp; str){
				return Converter&lt;To,InnerFrom&gt;::convert(str);
			}
		};
	}

	//the function itself
	template&lt;class To,class From&gt;
	typename privat::ConvertHelper&lt;To,From,boost::is_pointer&lt;From&gt;::value&gt;::returnType 
	char_convert(const From&amp; input){
		return privat::ConvertHelper&lt;To,From,boost::is_pointer&lt;From&gt;::value&gt;::convert(input);
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/807100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807100</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 11 Jun 2005 11:28:11 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 16:52:28 GMT]]></title><description><![CDATA[<p>iiiiih boost! nee lass mal. Bevor mein Programm total aus den Näten platzt lasse ich das lieber. <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/807216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807216</guid><dc:creator><![CDATA[&#x27;&#x27;&#x27;]]></dc:creator><pubDate>Sat, 11 Jun 2005 16:52:28 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 19:59:33 GMT]]></title><description><![CDATA[<p>das was da aus boost benutzt wird ist nur minimal und das kannst du auch einfach nachprogrammieren.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/807299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807299</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 11 Jun 2005 19:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 20:56:19 GMT]]></title><description><![CDATA[<p>Dir zu liebe, ohne Garantie, iplementierungen für is_pointer,remove_const und remove_pointer:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct is_pointer
{
    enum{value=false};    //static const bool, können aber meines wissens nach nicht alle compiler
};

template&lt;class T&gt;
struct is_pointer&lt;T*&gt;
{
    enum{value=true};
};

template&lt;class T&gt;
struct remove_const
{
    typedef T type;
};

template&lt;class T&gt;
struct remove_const&lt;const T&gt;
{
    typedef T type;
};

template&lt;class T&gt;
struct remove_pointer
{
    typedef T type;
};

template&lt;class T&gt;
struct remove_pointer&lt;T*&gt;
{
    typedef T type;
};
</code></pre>
<p>Das sollte dein Programm kein byte größer machen, da nix instanziert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/807318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807318</guid><dc:creator><![CDATA[ness]]></dc:creator><pubDate>Sat, 11 Jun 2005 20:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sat, 11 Jun 2005 23:43:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6405">@ness</a>:<br />
wie benutzt man das?!?!?! <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/807359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807359</guid><dc:creator><![CDATA[+++++++++++++++++++]]></dc:creator><pubDate>Sat, 11 Jun 2005 23:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Sun, 12 Jun 2005 00:38:06 GMT]]></title><description><![CDATA[<p>Wenn du z.b. immer sicherstellen willst das du den grund typen bekommst: ( Ohne const, pointer usw )</p>
<pre><code class="language-cpp">template &lt; typename Type &gt;
struct always_int
{
  typedef typename remove_const&lt; typename remove_pointer&lt; typename remove_const&lt; Type &gt;::type &gt;::type &gt;::type type;
};

std::string bool_to_str( bool val )
{
  return ( val ? &quot;true&quot; : &quot;false&quot; );
}

int main()
{
  std::cout &lt;&lt; bool_to_str( typeid(always_int&lt; const int * const &gt;::type) == typeid(int) ) &lt;&lt; std::endl;
  std::cout &lt;&lt; bool_to_str( typeid(always_int&lt; const int *       &gt;::type) == typeid(int) ) &lt;&lt; std::endl;
  std::cout &lt;&lt; bool_to_str( typeid(always_int&lt; const int         &gt;::type) == typeid(int) ) &lt;&lt; std::endl;
  std::cout &lt;&lt; bool_to_str( typeid(always_int&lt;       int * const &gt;::type) == typeid(int) ) &lt;&lt; std::endl;
  std::cout &lt;&lt; bool_to_str( typeid(always_int&lt;       int *       &gt;::type) == typeid(int) ) &lt;&lt; std::endl;
  std::cout &lt;&lt; bool_to_str( typeid(always_int&lt;       int         &gt;::type) == typeid(int) ) &lt;&lt; std::endl;
}
</code></pre>
<pre><code>Output:
true
true
true
true
true
true
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/807367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/807367</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sun, 12 Jun 2005 00:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Thu, 05 Jan 2006 08:13:02 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>hab durch zufall diesen Thread gefunden und bin auch sehr an diesem &quot;cast&quot; interessiert. Jedoch habe ich den Code von Otze ausprobiert, doch er geht nicht <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="😞"
    /> Er bringt das Programm zum absturz <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="😞"
    /></p>
<p>Weiß einer warum? <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/957417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957417</guid><dc:creator><![CDATA[&#x27;#&#x27;]]></dc:creator><pubDate>Thu, 05 Jan 2006 08:13:02 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Thu, 05 Jan 2006 08:34:30 GMT]]></title><description><![CDATA[<blockquote>
<p>hab durch zufall diesen Thread gefunden und bin auch sehr an diesem &quot;cast&quot; interessiert.</p>
</blockquote>
<p>Verarsch doch die Leute nicht. Du bist doch der Threadstarter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957421</guid><dc:creator><![CDATA[LOL!]]></dc:creator><pubDate>Thu, 05 Jan 2006 08:34:30 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Thu, 05 Jan 2006 10:33:44 GMT]]></title><description><![CDATA[<p>Ich versteh ehrlich gesagt nicht, warum ihr diese Unmengen von Code postet.</p>
<p>Was ist mit</p>
<p>mbtowc()<br />
wctomb()<br />
mbstowcs()<br />
wcstombs()</p>
<p>oder unter Windows auch</p>
<p>WideCharToMultiByte()<br />
MultiByteToWideChar()</p>
<p>Ist natürlich alles C und umständlich zu nutzen, aber hat für mich immer funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957542</guid><dc:creator><![CDATA[pZy]]></dc:creator><pubDate>Thu, 05 Jan 2006 10:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Thu, 05 Jan 2006 13:01:31 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::string bool_to_str( bool val )
{
  return ( val ? &quot;true&quot; : &quot;false&quot; );
}
</code></pre>
</blockquote>
<p>Das brauchst du nicht wirklich. Dafuer kannst du auch das Flag boolalpha setzen ;).</p>
<p>mfg<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957761</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Thu, 05 Jan 2006 13:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to uni_cast? on Thu, 05 Jan 2006 16:18:37 GMT]]></title><description><![CDATA[<p>pZy schrieb:</p>
<blockquote>
<p>Ist natürlich alles C und umständlich zu nutzen, aber hat für mich immer funktioniert.</p>
</blockquote>
<p>weil es nicht plattformunabhaengig ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957956</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 05 Jan 2006 16:18:37 GMT</pubDate></item></channel></rss>