<?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[Backslash in Makro]]></title><description><![CDATA[<p>Hallo</p>
<pre><code class="language-cpp">#define MAKRO_MIT_BACKSLASH using BASE::operator\;
</code></pre>
<p>Das \ interpretiert wohl der precompiler als &quot;neue&quot; Zeile, was aber nicht am Zeilenende steht -&gt; &quot;verirreter \&quot; als Fehlermeldung.</p>
<p>Wie gehts richtig?<br />
Danke Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/250610/backslash-in-makro</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 00:29:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250610.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Sep 2009 11:24:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:24:43 GMT]]></title><description><![CDATA[<p>Hallo</p>
<pre><code class="language-cpp">#define MAKRO_MIT_BACKSLASH using BASE::operator\;
</code></pre>
<p>Das \ interpretiert wohl der precompiler als &quot;neue&quot; Zeile, was aber nicht am Zeilenende steht -&gt; &quot;verirreter \&quot; als Fehlermeldung.</p>
<p>Wie gehts richtig?<br />
Danke Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782093</guid><dc:creator><![CDATA[markouser]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:24:43 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:29:38 GMT]]></title><description><![CDATA[<p>Was soll das für ein Operator sein?<br />
operator\ gibt es nicht, nur operator/.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782095</guid><dc:creator><![CDATA[fogge]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:31:36 GMT]]></title><description><![CDATA[<p>Oh Mann. Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782098</guid><dc:creator><![CDATA[markouser]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:33:53 GMT]]></title><description><![CDATA[<p>ich trau mich fast nicht zu fragen: wozu brauchst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782099</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:34:45 GMT]]></title><description><![CDATA[<p>Du kannst damit einfach defines über mehrere Zeilen verteilen, z.B. sowas:</p>
<pre><code class="language-cpp">#define NONSENS \
	if(0) {\
		printf(&quot;hab nix zu sagen...&quot;)\
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1782101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782101</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:38:25 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/248">@matze</a><br />
Ja genau deswegen kam diese kleine &quot;Verwechslung&quot; zu stande</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
Ich habe ein Template welches ich MEHRFACH spazialisere. Für die Spezialisierung habe ich eine Basis für die Gemeinsamkeiten.<br />
Das Makro nutze ich um die Operatoren der Basis zu nutzen da diese überall gleich sind und ich es für unübersichtlich halte das &quot;using ...&quot; jedes mal abzuschreiben.<br />
Ich fürchte jetzt hagelt es Gründe warum das grauenhaft ist? <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/1782105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782105</guid><dc:creator><![CDATA[markouser]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:44:21 GMT]]></title><description><![CDATA[<p>markouser schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
Ich habe ein Template welches ich MEHRFACH spazialisere. Für die Spezialisierung habe ich eine Basis für die Gemeinsamkeiten.<br />
Das Makro nutze ich um die Operatoren der Basis zu nutzen da diese überall gleich sind und ich es für unübersichtlich halte das &quot;using ...&quot; jedes mal abzuschreiben.<br />
Ich fürchte jetzt hagelt es Gründe warum das grauenhaft ist? <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>
</blockquote>
<p>Naja, Makros verschleiern oft was dahinter steckt, wenns allerdings um viele Zeilen geht, kann man das schonmal machen ( <code>#undef</code> fen des Makros am Ende nicht vergessen). Beim operator/ seh ich das allerdings nicht so recht, da man den eh meist als freie Funktion implementieren sollte. Zeig doch mal einen Ausschnitt mit deiner Basisklasse und einer der Spezialisierungen <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/1782113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782113</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:44:21 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 11:52:54 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>markouser schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
Ich habe ein Template welches ich MEHRFACH spazialisere. Für die Spezialisierung habe ich eine Basis für die Gemeinsamkeiten.<br />
Das Makro nutze ich um die Operatoren der Basis zu nutzen da diese überall gleich sind und ich es für unübersichtlich halte das &quot;using ...&quot; jedes mal abzuschreiben.<br />
Ich fürchte jetzt hagelt es Gründe warum das grauenhaft ist? <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>
</blockquote>
<p>Naja, Makros verschleiern oft was dahinter steckt, wenns allerdings um viele Zeilen geht, kann man das schonmal machen ( <code>#undef</code> fen des Makros am Ende nicht vergessen). Beim operator/ seh ich das allerdings nicht so recht, da man den eh meist als freie Funktion implementieren sollte. Zeig doch mal einen Ausschnitt mit deiner Basisklasse und einer der Spezialisierungen <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>Ja deswegen (ich trau mich kaum das zu sagen) wird dir nun auch gleich Auffallen dass der Rüchgabetyp der Basis bereits die (einzige) Ableitung ist ... aber es funktioniert so gut! <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>
<pre><code class="language-cpp">template&lt;int op,typename first_t, typename second_t&gt;
	class term_base
	{
			template&lt;typename T&gt;
		term&lt;PLUS,term&lt;op,first_t,second_t&gt;,T&gt; operator+(const T&amp;);

		template&lt;typename T&gt;
		term&lt;MINUS,term&lt;op,first_t,second_t&gt;,T&gt; operator-(const T&amp;);

		template&lt;typename T&gt;
		term&lt;MULT,term&lt;op,first_t,second_t&gt;,T&gt; operator*(const T&amp;);

		template&lt;typename T&gt;
		term&lt;DIV,term&lt;op,first_t,second_t&gt;,T&gt; operator/(const T&amp;);
	};
</code></pre>
<p>Eine der geplanten 6 Spezialisierungen</p>
<pre><code class="language-cpp">template&lt;typename first_t, typename second_t&gt;
	struct term&lt;MULT,first_t,second_t&gt; : public term_base&lt;MULT,first_t,second_t&gt;
	{
		typedef term_base&lt;MULT,first_t,second_t&gt; BASE;
		MTL_SYM_USE_BASE_OPERATORS

                //Noch ein paar andere zensierte Sachen  ....

		friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; stream, const term&lt;MULT,first_t,second_t&gt;&amp; t) {
			stream &lt;&lt; t.m_first &lt;&lt; &quot; * &quot; &lt;&lt; t.m_second;
			return stream;
		}
	};
</code></pre>
<p>Nunja ... wenn du das jetzt so weit zerlegen solltest und sagst dass man das vielleicht schöner mit Polymorphie regeln könnte:<br />
Ich möchte in diesem Fall auf Speicherverwaltung (new/delete) verzichten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782121</guid><dc:creator><![CDATA[markouser]]></dc:creator><pubDate>Mon, 21 Sep 2009 11:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 12:17:15 GMT]]></title><description><![CDATA[<p>Mit freien Operatoren sähe das dann so aus:</p>
<pre><code class="language-cpp">template &lt;class first_t, class second_t&gt;
term&lt;MULT, first_t, second_t&gt; operator* (first_t const&amp; lhs, second_t const&amp; rhs);

// usw.

template&lt;int OP&gt;
struct op_traits;

template &lt;int OP, class first_t, class second_t&gt;
struct term
{
  //keine basis benoetigt soweit.
  //keine geerbten ops benoetigt

  typedef term&lt;OP, first_t, second_t&gt; this_t;

  friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; stream, this_t const&amp; t) 
  {
     stream &lt;&lt; t.m_first &lt;&lt; &quot; &quot; &lt;&lt; op_traits&lt;OP&gt;::operator_char &lt;&lt; &quot; &quot; &lt;&lt; t.m_second;
     return stream;
  }
};

template &lt;&gt;
struct op_traits&lt;MULT&gt;
{
  const static char operator_char = '*';
};
</code></pre>
<p>Die speziellen Einzelheiten kann man aus dem term-Template in die Traits auslagern, damit wirds noch etwas übersichtlicher.</p>
<p>zum freien Operator ist noch zu sagen, dass du die ganzen Templates inklusive der freien Operatoren am Besten in einen eigenen Namespace packst, weil die template-operatoren sonst wirklich ALLES multiplizieren was du ihnen vorgibst - im namespace werden sie nur per koenig-Lookup gefunden, d.h. wenn einer der OPeranden auch aus den Namespace kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782143</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Sep 2009 12:17:15 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 12:21:51 GMT]]></title><description><![CDATA[<p>sehr sehr sehr schön.<br />
Herzlichen Dank! Ich versuche das gleich mal umzusetzen. <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/1782145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782145</guid><dc:creator><![CDATA[kein markouser mehr]]></dc:creator><pubDate>Mon, 21 Sep 2009 12:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 14:04:37 GMT]]></title><description><![CDATA[<p>Also ich habe damit nun satte 150 Zeilen gespart!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Wegen diesem Ergebnis frage ich daher noch eine Kleinigkeit:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class var
{
//Irrelevant
};

template&lt;typename T&gt;
class var_ptr
{
	var&lt;T&gt;* m_target;
        public:
	var_ptr(var&lt;T&gt;&amp;);

	T value() const { return m_target-&gt;value(); }		

	friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; stream, const var_ptr&lt;T&gt;&amp; vptr) {
		stream &lt;&lt; vptr.m_target-&gt;name();
		return stream;
	}
};
</code></pre>
<p>Wenn ich nun 2 var&lt;double&gt; addieren möchte würde ja (laut globalen operatoren)</p>
<pre><code class="language-cpp">term&lt;PLUS,var&lt;double&gt;,var&lt;double&gt;&gt; entstehen.
</code></pre>
<p>Term darf aber niemals var direkt beinhalten sondern <strong>ausschließlich</strong> var_ptr! (Also wenn es sich überhaupt um ein var&lt;T&gt; handelt!) Wie löse ich das am elegantesten? <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>Bis jetzt habe ich sowas, aber das ist ja eigendlich die Aufgabe der globalen Operatoren...</p>
<pre><code class="language-cpp">template&lt;typename T&gt; template&lt;typename T2&gt;
	term&lt;PLUS,var_ptr&lt;T&gt;,T2 &gt; var&lt;T&gt;::operator+(const T2&amp; v){
		return term&lt;PLUS,var_ptr&lt;T&gt;,T2 &gt;(*this,v);
	}
	template&lt;typename T&gt; template&lt;typename T2&gt;
	term&lt;PLUS,var_ptr&lt;T&gt;,var_ptr&lt;T2&gt; &gt; var&lt;T&gt;::operator+(var&lt;T2&gt;&amp; v){
		return operator+(var_ptr&lt;T2&gt;(v));
	}
</code></pre>
<p>Wenn ich die global machen möchte bräcute ich dafür 3 Spezialisierungen?!<br />
var + x<br />
x + var<br />
var + var<br />
oder? <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/1782197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782197</guid><dc:creator><![CDATA[markouser]]></dc:creator><pubDate>Mon, 21 Sep 2009 14:04:37 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 17:00:44 GMT]]></title><description><![CDATA[<p>markouser schrieb:</p>
<blockquote>
<p>Wenn ich die global machen möchte bräcute ich dafür 3 Spezialisierungen?!<br />
var + x<br />
x + var<br />
var + var<br />
oder? <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>Operatoren/Funktionen kann man leider nicht spezialisieren. Höchstens überladen.<br />
Ich würds auf den ersten Blick über eine Metafunktion regeln:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct var_wrapper
{
  typedef T type; //allgemeiner Fall
};
template &lt;class W&gt;
struct var_wrapper&lt;var&lt;W&gt; &gt;
{
  typedef var_ptr&lt;W&gt; type;
};

template &lt;class left_t, class right_t&gt;
term&lt;MULT, typename var_wrapper&lt;left_t&gt;::type, typename var_wrapper&lt;right_t&gt;::type&gt; operator* (left_t const&amp; lhs, right_t const&amp; rhs)
{
  typedef typename var_wrapper&lt;left_t&gt;::type leftwrap_t;
  typedef typename var_wrapper&lt;right_t&gt;::type rightwrap_t;
  return term&lt;MULT, leftwrap_t, rightwrap_t&gt;( leftwrap_t(lhs), rightwrap_t(rhs) );
}
</code></pre>
<p>sieht hässlich aus, sollte aber funktionieren. lhs wird umgewandelt, und zwar im Normalfall in ein Objekt vom selben Typ, was der Compiler wegoptimieren kann. Ebenso rhs. für var&lt;X&gt; wirds aber in ein var_ptr&lt;X&gt; gewandelt, was der Konstruktor von var_ptr&lt;X&gt; ja möglich macht.</p>
<p>Das jetzt für jeden operator auszuschreiben könnte aber frickelig werden - was uns wieder zu Makros bringt (einer der, wie ich finde, &quot;erlaubten&quot; Anwendungen von Makros):</p>
<pre><code class="language-cpp">#define TERM_BINARY_OP(opword, op) \
template &lt;class left_t, class right_t&gt; \
term&lt; opword , typename var_wrapper&lt;left_t&gt;::type, typename var_wrapper&lt;right_t&gt;::type&gt; \
operator op (left_t const&amp; lhs, right_t const&amp; rhs) \
{  \
  typedef typename var_wrapper&lt;left_t&gt;::type leftwrap_t; \
  typedef typename var_wrapper&lt;right_t&gt;::type rightwrap_t; \
  return term&lt; opword , leftwrap_t, rightwrap_t&gt;( leftwrap_t(lhs), rightwrap_t(rhs) ); \
} 

TERM_BINARY_OP(MULT, *)
TERM_BINARY_OP(DIV, /)
TERM_BINARY_OP(PLUS, +)
TERM_BINARY_OP(MINUS, -)

#undef TERM_BINARY_OP
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1782282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782282</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Sep 2009 17:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 17:59:11 GMT]]></title><description><![CDATA[<p>AAAlllso<br />
Ich habe nun versucht das zu übernehmen, aber hier</p>
<pre><code class="language-cpp">return term&lt;MULT, leftwrap_t, rightwrap_t&gt;( leftwrap_t(lhs), rightwrap_t(rhs) );
</code></pre>
<p>Kopiert der Wrapper das Objekt in den selben Typ (hier optimiert dann wohl gcc), wenn es ein var&lt;T&gt; ist wird es in var_ptr&lt;T&gt; umgewandelt und dabei var&lt;T&gt; kopiert (oder gecastet??)<br />
Jedoch darf var&lt;T&gt; nicht kopiert werden! Das ist ein vom User erzeugte Instanz, daher auch der var_ptr Umstand.<br />
Das kann man hieran gut sehen:</p>
<blockquote>
<p>224: error: no matching function for call to 'mtl::var_ptr&lt;float&gt;::var_ptr(const mtl::var&lt;float&gt;&amp;)'</p>
</blockquote>
<p>var_ptr hätte somit einen Zeiger auf ein lokales Objekt (const var&lt;T&gt;&amp;) was natürlich sinnlos ist. Der Zeiger soll ja wie gesagt auf die User Instnaz zeigen und Kopieren ist daher ausgeschlossen.</p>
<p>Gedanken zur Lösung konnte ich mir noch nicht machen das ist also nur ein Zwischenbericht.</p>
<p>Danke für Gedult und Mühe! <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/1782322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782322</guid><dc:creator><![CDATA[markouser]]></dc:creator><pubDate>Mon, 21 Sep 2009 17:59:11 GMT</pubDate></item><item><title><![CDATA[Reply to Backslash in Makro on Mon, 21 Sep 2009 18:28:55 GMT]]></title><description><![CDATA[<p>So habe nun das draus gemacht... im Nachhinein ist das wohl von Anfang an nur ein cast-problem und es wird nirgends kopiert? Ich bin verwirrt.<br />
So scheint es jedenfalls zu funktionieren:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
	struct var_wrapper {
		typedef T type;
		static type wrap(type t){
			return t;	
		}
	};
	template &lt;class W&gt;
	struct var_wrapper&lt;var&lt;W&gt; &gt; {
  		typedef var_ptr&lt;W&gt; type;
		static type wrap(const var&lt;W&gt;&amp; v) {
                        //Ist dieser cast zu abendteuerlich? 
			return type(*const_cast&lt;var&lt;W&gt;*&gt; (&amp;v));
		}
	};

	#define TERM_BINARY_OP(opword, op) \
	template &lt;class left_t, class right_t&gt; \
	term&lt; opword , typename var_wrapper&lt;left_t&gt;::type, typename var_wrapper&lt;right_t&gt;::type&gt; \
	operator op (left_t const&amp; lhs, right_t const&amp; rhs) \
	{  \
		typedef typename var_wrapper&lt;left_t&gt;::type leftwrap_t; \
		typedef typename var_wrapper&lt;right_t&gt;::type rightwrap_t; \
		return term&lt; opword , leftwrap_t, rightwrap_t&gt;( var_wrapper&lt;left_t&gt;::wrap(lhs), var_wrapper&lt;right_t&gt;::wrap(rhs) ); \
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1782341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782341</guid><dc:creator><![CDATA[markouser]]></dc:creator><pubDate>Mon, 21 Sep 2009 18:28:55 GMT</pubDate></item></channel></rss>