<?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[Pointer auf jede Template-Variation]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Template-Klasse und benötige nun einen Pointer auf jede mögliche Template-Variation. Die über diesen Pointer aufgerufen Funktionen sind NICHT abhängig von den Template-Argumenten, weshalb das unbedenklich ist.</p>
<p>Hat jemand schnelle Hilfe parat?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/253523/pointer-auf-jede-template-variation</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 15:14:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253523.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Nov 2009 15:31:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 15:31:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Template-Klasse und benötige nun einen Pointer auf jede mögliche Template-Variation. Die über diesen Pointer aufgerufen Funktionen sind NICHT abhängig von den Template-Argumenten, weshalb das unbedenklich ist.</p>
<p>Hat jemand schnelle Hilfe parat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802739</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 03 Nov 2009 15:31:13 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 15:35:21 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Hat jemand schnelle Hilfe parat?</p>
</blockquote>
<p>Vererbung:</p>
<pre><code class="language-cpp">class Gemeinsam {
  ...
};

template&lt;typename T&gt;
class Muster : public Gemeinsam {
  ...
};

void foo(Gemeinsam* zeiger)
{
  zeiger-&gt;elementfunktion();
}
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802740</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 03 Nov 2009 15:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 15:45:18 GMT]]></title><description><![CDATA[<p>Da hast du mich falsch verstanden.</p>
<p>Ich brauche folgendes:</p>
<pre><code class="language-cpp">typedef TemplKlasse&lt;ALL_TYPES&gt; TEMPL_KLASSE, *LP_TEMPL_KLASSE;

void Func(LPVOID Args) {
	LP_TEMPL_KLASSE lpTemplKlasse = reinterpret_cast&lt;LP_TEMPL_KLASSE&gt;(Args);
	lpTemplKlasse-&gt;Ui();	
} 

template&lt;typename T&gt;
class TemplKlasse
{
private:
	[...]

public:
	void Ui(void) {
		[...]
	}
};
</code></pre>
<p>EDIT:</p>
<p>Ja, ja - jetzt sehe ich warum du das machst. Da habe ich dich mit &quot;NICHT abhängig von den Template-Argumenten&quot; auf die falsche Fährte gelockt.</p>
<p>Es ist zwar in der Tat so, dass das in &quot;Ui&quot; aufgerufene Member IMMER GLEICH benutzt wird; Der Inhalt dieses Members ist jedoch DOCH abhängig von den Template-Argumenten:</p>
<pre><code class="language-cpp">typedef TemplKlasse&lt;ALL_TYPES&gt; TEMPL_KLASSE, *LP_TEMPL_KLASSE;

void Func(LPVOID Args) {
    LP_TEMPL_KLASSE lpTemplKlasse = reinterpret_cast&lt;LP_TEMPL_KLASSE&gt;(Args);
    lpTemplKlasse-&gt;Ui();   
}

template&lt;typename T&gt;
class TemplKlasse
{
private:
    /*class*/ boah&lt;T&gt; _Member;

public:
    void Ui(void) {
        cout &lt;&lt; _Member.crazy_func() &lt;&lt; endl;
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1802746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802746</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 03 Nov 2009 15:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 15:47:38 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Da hast du mich falsch verstanden.</p>
</blockquote>
<p>glaube ncht, dass er das falsch verstanden hat...</p>
<p>nur hast du seine antwort eben nicht verstanden...</p>
<p>edit:<br />
na und?<br />
&quot;virtual&quot; ist dein freund <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1802755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802755</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 03 Nov 2009 15:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 15:47:36 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Da hast du mich falsch verstanden.</p>
</blockquote>
<p>glaube ncht, dass er das falsch verstanden hat...<br />
nur hast du seine antwort eben nicht verstanden...</p>
</blockquote>
<p>Doch das habe ich, hast du meine Editierung gelesen oder war dein Posting schneler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802756</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 03 Nov 2009 15:47:36 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 15:54:46 GMT]]></title><description><![CDATA[<p>Was willst du da als virtual deklarieren? &quot;ui&quot; oder &quot;crazy_func&quot;?</p>
<p>In der Template-Klasse ändert sich NICHTS am Aufruf dieses Members. Von daher brauche ich keine übergeordnete Klasse schaffen, in der ich &quot;ui&quot; als virtual deklariere und dann in der Template-Klasse überschreibe.</p>
<p>Und falls du &quot;crazy_func&quot; meinst - sagen wir mal, da habe ich keinen Einfluss drauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802759</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 03 Nov 2009 15:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 16:08:04 GMT]]></title><description><![CDATA[<p>ui, sonst bringt es ja nix... ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802769</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 03 Nov 2009 16:08:04 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 16:43:12 GMT]]></title><description><![CDATA[<p>Geht sowas :</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

struct A
{
	void ui()
	{
		std::cout &lt;&lt; &quot;A!\n&quot;;
	}
};

struct B
{
	void ui()
	{
		std::cout &lt;&lt; &quot;B!\n&quot;;
	}
};

class Base
{
public:
	Base()
	{
	}

	virtual ~Base()
	{
	}
	virtual void invoke() = 0;

private:
	Base( const Base&amp; );
	Base&amp; operator=( const Base&amp; );
};

template&lt;typename T&gt;
class Ptr : public Base
{
	T&amp; Obj_;

public:
	Ptr( T&amp; Obj ) : Obj_( Obj )
	{
	}

	void invoke()
	{
		Obj_.ui();
	}
};

template&lt;typename T&gt;
Base* make_ptr( T&amp; Obj )
{
	return new Ptr&lt;T&gt;( Obj );
}

int main(int argc, char* argv[])
{
	Base* p1 = make_ptr( *new A() );
	Base* p2 = make_ptr( *new B() );

	p1-&gt;invoke();
	p2-&gt;invoke();
}
</code></pre>
<p>Speicherlecks wegen Faulheit sind Absicht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1802780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802780</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 03 Nov 2009 16:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Tue, 03 Nov 2009 17:50:13 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>In der Template-Klasse ändert sich NICHTS am Aufruf dieses Members.</p>
</blockquote>
<p>Na und?</p>
<pre><code class="language-cpp">class Base
{
  virtual ~Base() = 0 {};
  virtual void Ui() = 0; //void als &quot;nicht-Parameter&quot; ist in C++ nicht nötig/üblich
};

template&lt;typename T&gt;
class TemplKlasse : public Base
{
  boah&lt;T&gt; member;
public:
  void Ui() //ist eh schon virtual, muss man nicht dranschreiben, ist aber ggf. besser
  {
    cout &lt;&lt; member.crazy_func() &lt;&lt; endl;
  }
};

void foo()
{
  Base* b1 = new TemplKlasse&lt;int&gt;();
  b1-&gt;Ui();
  delete b1;
  b1 = new TemplKlasse&lt;double&gt;();
  b1-&gt;Ui();
  delete b1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1802802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802802</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 03 Nov 2009 17:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 07:14:25 GMT]]></title><description><![CDATA[<p>Ja, ist eine ganz gute Idee. Danke schon mal. Hätte man auch drauf kommen können, aber ich dachte es gibt einen besseren Weg.</p>
<p>Normalerweiße definiere ich für solche Dinge einen Dummy-Typen. Das ist hier aber leider nicht möglich, da ja die Template-Argumente das Member verändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802995</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 04 Nov 2009 07:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 08:36:06 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ja, ist eine ganz gute Idee.</p>
</blockquote>
<p>das ist genau die Idee, die dir SP und unskilled nahebringen wollten <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1803031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803031</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 04 Nov 2009 08:36:06 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 09:28:41 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ja, ist eine ganz gute Idee.</p>
</blockquote>
<p>das ist genau die Idee, die dir SP und unskilled nahebringen wollten <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>Ja, da dachte ich er will auf etwas anderes heraus.<br />
Was mir jetzt noch fehlt ist eine Möglichkeit zu prüfen ob ein bestimmtest Template-Argument &quot;void&quot; ist. Eine Spezialisierung hilft mir nur bedingt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1803058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803058</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 04 Nov 2009 09:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 09:57:57 GMT]]></title><description><![CDATA[<p>Sagen dir type traits irgendetwas? Der folgende Code ist nur eine technische Lösung, vielleicht ist ein anderer Ansatz wie (partielle) Spezialisierung möglich?</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct type_traits
{
   enum { IsVoid = false };
};

template&lt;&gt;
struct type_traits&lt;void&gt;
{
   enum { IsVoid = true };
};

template&lt;typename T&gt;
void somefunc( T&amp; op )
{
   if( true == type_traits&lt;T&gt;::IsVoid )
   {
      // T ist vom Typ void
   }
   else
   {
      // T ist kein void
   }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1803069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803069</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 04 Nov 2009 09:57:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 10:21:20 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Sagen dir type traits irgendetwas? Der folgende Code ist nur eine technische Lösung, vielleicht ist ein anderer Ansatz wie (partielle) Spezialisierung möglich?</p>
</blockquote>
<p>Das Problem ist folgendes:<br />
Die Klasse selbst bekommt einen Funktionstypen übergeben, daher ist ein einfaches überprüfen auf void (durch Spezialisierung) nicht möglich. Innerhalb der Klasse komme ich jedoch an den Return-Typ des Funktionstypen dran.</p>
<p>Ich könnte jetzt per type trait eben überprüfen, ob es void ist oder nicht und je nachdem etwas anderes ausführen. Leider benötige ich jedoch auch eine Variable von diesem Typ und einen &quot;void&quot; Typen deklariert er nicht.</p>
<p>Ich denke ich werde einfach einen Pointer verwenden, für den ich mir dann dynamisch Speicher hole, wenn es nicht void ist.</p>
<p>btw. Man muss nicht explizit auf true prüfen <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>EDIT:<br />
Leider mag der Compiler dass nicht. Er sagt dass er keine void Objekte allokieren kann ... dass das nie passieren kann kann er ja nicht wissen. Mmmh, andere Lösung?</p>
<p>EDIT2:<br />
So lässt er sich für die Allokierung austricksen:</p>
<pre><code class="language-cpp">this-&gt;_ResultValue = reinterpret_cast&lt;LP_RESULT&gt;(new BYTE[sizeof(RESULT)]());
</code></pre>
<p>Aber die Dereferenzierung passt ihm halt einfach nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1803077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803077</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 04 Nov 2009 10:21:20 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 10:53:03 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Das Problem ist [...]</p>
</blockquote>
<p>dass Du scheinbar die falschen Fragen stellst, wenn Dir die Antworten auf Deine Fragen nicht weiterhelfen.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1803088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803088</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 04 Nov 2009 10:53:03 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 11:04:43 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>dass Du scheinbar die falschen Fragen stellst, wenn Dir die Antworten auf Deine Fragen nicht weiterhelfen.</p>
</blockquote>
<p>Stimmt. Die Antwort hat mir aber dennoch weitergeholfen. Ich habe es jetzt so gelöst (ist aber auf gar keinen Fall final und auch noch ungetestet)</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct type_traits {
	enum { IsVoid = false };
	typedef T TYPE;
	static const size_t Size = sizeof(T);
};

template&lt;&gt;
struct type_traits&lt;void&gt; {
	enum { IsVoid = true };
	typedef bool TYPE;
	static const size_t Size = 0;
};

	virtual void _Call(void) override {
		if( !type_traits&lt;RESULT&gt;::IsVoid )
		{
			size_t nSize		 = type_traits&lt;RESULT&gt;::Size;
			this-&gt;_ResultValue   = new BYTE[nSize]();
			LPVOID MemberAddress = reinterpret_cast&lt;LPVOID&gt;(&amp;this-&gt;_function);

			typedef RESULT (function&lt;Signature&gt;::*LP_FUNCTION)(void) const;
			LP_FUNCTION lpFunction = &amp;function&lt;Signature&gt;::operator ();

			ASM 
			{
[asm]				push	esi
				push	edi

				mov		ecx, MemberAddress
				call	lpFunction		

				mov		esi, DWORD PTR [_ResultValue]
				mov		edi, eax
				mov		ecx, nSize
				repnz	movsb

				pop		edi
				pop		esi[/asm]
			}
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1803093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803093</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 04 Nov 2009 11:04:43 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 12:05:47 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">[...]
</code></pre>
</blockquote>
<p>Was soll das denn? Willst Du das bei <a href="http://thedailywtf.com/" rel="nofollow">DailyWTF</a> einreichen?</p>
<p>Ich habe das Gefühl, dass das, was Du machen willst, <em>viel einfacher und vor allem viel eleganter</em> geht. Du bist auf dem besten Weg, Dir die Beine abzuschießen.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1803122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803122</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 04 Nov 2009 12:05:47 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 12:28:57 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Ich habe das Gefühl, dass das, was Du machen willst, <em>viel einfacher und vor allem viel eleganter</em> geht. Du bist auf dem besten Weg, Dir die Beine abzuschießen.</p>
</blockquote>
<p>Wenn ich das Gefühl nicht auch gehabt hätte, hätte ich nicht gefragt. Aber es ist nur halb so schlimm wie es aussieht. Das Problem ist, dass ich innerhalb von einem Thread den Rückgabewert der darin aufgerufenen Funktion haben möchte.</p>
<p>Da dieser jedoch Template-Argument abhängig ist, kann es jeder beliebige Typ sein. Mir fällt da keine bessere Variante ein und vor allem funktioniert es.</p>
<p>So jedenfalls:</p>
<pre><code class="language-asm">push	esi
push	edi
push	ebx

mov		ebx, ecx
mov		ecx, [MemberAddress]
call	lpFunction
mov		ecx, ebx

lea	edi, [ecx]._ResultValue
mov		edi, [edi]
push	eax
mov		esi, esp
mov		ecx, nSize
repnz	movsb	
pop		eax

pop		ebx
pop		edi
pop		esi
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1803138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803138</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 04 Nov 2009 12:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 14:04:23 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Wenn ich das Gefühl nicht auch gehabt hätte, hätte ich nicht gefragt.</p>
</blockquote>
<p>Und warum stellst Du dann so komische Fragen, die mit Deinem Problem gar nichts zu tun haben? Man (zumindest ich) weiß immer noch nicht, was Du eigentlich machen willst. Irgendwas mit Threads. Irgendwas mit Template-Parametern für Rückgabetypen von Funktionen. Das reicht aber nicht aus, um Verbesserungsvorschläge geben zu können.</p>
<p>Wenn Du mit dem Assembler-Gefrickel ( <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /> ) zufrieden bist, ist ja alles i.O. :p</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1803210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803210</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 04 Nov 2009 14:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf jede Template-Variation on Wed, 04 Nov 2009 15:40:16 GMT]]></title><description><![CDATA[<p>Wieso weiß man nicht was ich machen will?</p>
<p>Meine Anfangs Frage wurde doch beantwortet. Ich habe es mit einer Interface-Klasse inkl. der virtuellen Methode die den call macht gelöst.</p>
<p>Alles weitere war jetzt ja nur eine neue Frage von mir, für die ich keinen neuen Thread aufmachen wollte. Die Frage war, wie ich ein Template-Argument auf void prüfe. Auch das ist erledigt und meine Lösung habe ich gepostet.</p>
<p>Wegen dem &quot;Assembler-Gefrickel&quot;:<br />
Wie hättest du es denn gelöst? Worum es exakt geht? Es existiert eine Thread-Funktion vom Typ unsigned long (__stdcall)(void*). Innerhalb dieser Thread-Funktion wird eine weitere FUnktion aufgerufen deren Rückgabewert ich benötige. Standardmäßig würde ich der Thread-Funktion nun also einen Pointer auf den Result übergeben, dessen Dereferenzierung ich dann die Funktion zuweise. Das geht aber nicht, da der Rückgabewert von der inneren Funktion von den Template-Argumenten abhängig ist. Ich habe also keine Ahnung von welchem Typ der Result sein soll, also wird dass so schon mal nichts. Da der Return-Wert bei einer __cdecl Funktion aber immer im EAX Register liegt (insofern kein Double oder anderer 8 Byte Typ, dann sieht's anders aus) ist das wohl schon mal ein Ansatz. Ist aber immer noch Scheiße.</p>
<p>Ich habe schon eine weitaus bessere Variante. Ich werde sie heute Abend posten.</p>
<p>EDIT:</p>
<pre><code class="language-cpp">typename type_traits&lt;RESULT&gt;::TYPE _ResultValue;

	virtual void _Call(void) override {
		if( !type_traits&lt;RESULT&gt;::IsVoid ) {
			this-&gt;_ResultValue = this-&gt;_function();
		}
		else {
			this-&gt;_function();
		}
	}
</code></pre>
<p>TYPE is immer der gleiche Typ wie RESULT; außer wenn RESULT void ist, dann ist TYPE bool. Somit ist es immer eine gültige Deklaration.</p>
<p>Hat immer noch das Problem, dass der Compiler keien Ahnung davon hat, dass das Code-Segment welches true zurückliefert nie ausgeführt wird, wenn RESULT void ist. Daher verweigert er den Dienst.</p>
<p>EDIT2:</p>
<p>Ich denke so ist es ganz gut gelöst:</p>
<pre><code class="language-cpp">template&lt;typename Signature, typename Return&gt;
struct function_wrapper abstract {
	static void HandleReturn(Klasse&lt;Signature&gt;* Instance, Return* ReturnValue) {
		if( (ReturnValue != NULL) &amp;&amp; (Instance != NULL) )
			*ReturnValue = Instance-&gt;_function();
	}
};

template&lt;typename Signature&gt;
struct function_wrapper&lt;Signature, void&gt; abstract {
	static void HandleReturn(Klasse&lt;Signature&gt;* Instance, void* ReturnValue) {
		if( Instance != NULL )
			Instance-&gt;_function();
	}
};

template&lt;typename Signature&gt;
class Klasse sealed
{
private:
	virtual void _Call(void) override {
		function_wrapper&lt;Signature, RESULT&gt;::HandleReturn(this, &amp;this-&gt;_ResultValue); 
	}

	template&lt;typename Signature, typename Return&gt;
	friend struct function_wrapper;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1803261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1803261</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 04 Nov 2009 15:40:16 GMT</pubDate></item></channel></rss>