<?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[Template Pointer]]></title><description><![CDATA[<p>Hallöchen,<br />
kurz und knapp:</p>
<pre><code>template&lt;typename T&gt;
void test(T a)
{
	std::cout &lt;&lt; a std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
	reinterpret_cast&lt;DWORD&gt;(&amp;test&lt;int&gt;);
}
</code></pre>
<pre><code>Fehler	1	error C2440: 'reinterpret_cast': 'void (__cdecl *)(T)' kann nicht in 'DWORD' konvertiert werden
</code></pre>
<p>Wieso kriegt das der MSVC-Compiler nicht gebacken (GCC funzt) und kennt da zufällig einer nen Workaround?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327354/template-pointer</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 10:45:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327354.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Aug 2014 12:30:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 12:30:31 GMT]]></title><description><![CDATA[<p>Hallöchen,<br />
kurz und knapp:</p>
<pre><code>template&lt;typename T&gt;
void test(T a)
{
	std::cout &lt;&lt; a std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
	reinterpret_cast&lt;DWORD&gt;(&amp;test&lt;int&gt;);
}
</code></pre>
<pre><code>Fehler	1	error C2440: 'reinterpret_cast': 'void (__cdecl *)(T)' kann nicht in 'DWORD' konvertiert werden
</code></pre>
<p>Wieso kriegt das der MSVC-Compiler nicht gebacken (GCC funzt) und kennt da zufällig einer nen Workaround?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412234</guid><dc:creator><![CDATA[template pointer]]></dc:creator><pubDate>Wed, 06 Aug 2014 12:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 12:41:46 GMT]]></title><description><![CDATA[<p><s><a href="http://stackoverflow.com/questions/5277547/directly-casting-from-pointer-to-a-template-function" rel="nofollow">http://stackoverflow.com/questions/5277547/directly-casting-from-pointer-to-a-template-function</a></s><br />
@Arcoth: auch wieder wahr... <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/2412237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412237</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 06 Aug 2014 12:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 12:39:56 GMT]]></title><description><![CDATA[<p>Es ist nicht immer erlaubt einen Zeiger so zu konvertieren.</p>
<p>§5.2.10 schrieb:</p>
<blockquote>
<p>Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.<br />
[..]<br />
A pointer can be explicitly converted to any integral type <strong>large enough to hold it</strong>.</p>
</blockquote>
<p>Ich rate mal: <code>DWORD</code> ist bei deinem GCC groß genug aber bei deinem VC++ nicht?</p>
<p>Edit, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19131">@theta</a>: Was hat der Link mit dem Problem zu tun? <code>void* != DWORD</code> , und ein <code>reinterpret_cast</code> sehe ich dort auch nirgends <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/2412238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412238</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 06 Aug 2014 12:39:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 12:43:32 GMT]]></title><description><![CDATA[<p>Aber das hier funktioniert ja:</p>
<pre><code>void test(int a)
{
	std::cout &lt;&lt; a std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
	reinterpret_cast&lt;DWORD&gt;(&amp;test);
}
</code></pre>
<p>Wo ist für den Compiler der Unterschied? - verstehe ich ehrlich gesagt nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412240</guid><dc:creator><![CDATA[template pointer]]></dc:creator><pubDate>Wed, 06 Aug 2014 12:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 12:46:15 GMT]]></title><description><![CDATA[<p>long long funktioniert auch nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412241</guid><dc:creator><![CDATA[template pointer]]></dc:creator><pubDate>Wed, 06 Aug 2014 12:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 12:48:57 GMT]]></title><description><![CDATA[<p>Hier ein Workaround:</p>
<pre><code>#include &lt;Windows.h&gt;

template&lt;typename T&gt;
void test(T) {}

int main()
{
    void (*fp)(int) = &amp;test&lt;int&gt;;
    reinterpret_cast&lt;DWORD&gt;(fp);
}
</code></pre>
<p>oder mit <strong>auto</strong>...</p>
<pre><code>#include &lt;Windows.h&gt;

template&lt;typename T&gt;
void test(T) {}

int main()
{
    auto fp = &amp;test&lt;int&gt;;
    reinterpret_cast&lt;DWORD&gt;(fp);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2412243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412243</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 06 Aug 2014 12:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 13:09:48 GMT]]></title><description><![CDATA[<p>template pointer schrieb:</p>
<blockquote>
<p>Wo ist für den Compiler der Unterschied? - verstehe ich ehrlich gesagt nicht.</p>
</blockquote>
<p>Kannste mal das hier ausführen?</p>
<pre><code>void test1(int a)
{
}

template&lt;typename T&gt;
void test2(T a)
{
}

int main()
{
	std::cout &lt;&lt; sizeof(DWORD) &lt;&lt; ' ' &lt;&lt; sizeof(long long) &lt;&lt; '\n';
	std::cout &lt;&lt; sizeof(&amp;test1) &lt;&lt; ' ' &lt;&lt; sizeof(&amp;test2&lt;int&gt;) &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2412253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412253</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 06 Aug 2014 13:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 13:13:36 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Kannste mal das hier ausführen?</p>
</blockquote>
<p>Nope, <code>sizeof(&amp;test2&lt;int&gt;)</code> führt zu:</p>
<pre><code>error: address of overloaded function with no contextual type information
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2412255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412255</guid><dc:creator><![CDATA[oenone]]></dc:creator><pubDate>Wed, 06 Aug 2014 13:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 13:22:24 GMT]]></title><description><![CDATA[<p>oenone schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Kannste mal das hier ausführen?</p>
</blockquote>
<p>Nope, <code>sizeof(&amp;test2&lt;int&gt;)</code> führt zu:</p>
<pre><code>error: address of overloaded function with no contextual type information
</code></pre>
</blockquote>
<p>lol? Bei mir auch!?<br />
Wieso funktioniert auto und decltype, aber nicht sizeof?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412257</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 06 Aug 2014 13:22:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 13:32:39 GMT]]></title><description><![CDATA[<p>decltype funktioniert auch nicht, dafür gibt's sogar schon einen Bugreport</p>
<pre><code>auto fp1 = &amp;T::fn_Write; // memberfunction
pFuncAddr2 = reinterpret_cast&lt;DWORD&gt;(fp2); // error
</code></pre>
<p>Fehler 1 error C2440: 'reinterpret_cast': 'uint32_t (__thiscall Klasse::* )(TypeNr1 &amp;,TypeNr2*)' kann nicht in 'DWORD' konvertiert werden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412258</guid><dc:creator><![CDATA[template pointer]]></dc:creator><pubDate>Wed, 06 Aug 2014 13:32:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 13:51:23 GMT]]></title><description><![CDATA[<p>Einen Memberzeiger darf man nicht in einen Integer konvertieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412262</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 06 Aug 2014 13:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 13:53:31 GMT]]></title><description><![CDATA[<p>Das Problem ist mir bekannt, nur kenne ich die Lösung nicht. Das einzigste was mir einfallen würde wäre, über GetProcAddres, aber muss doch auch ohne gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412263</guid><dc:creator><![CDATA[template pointer]]></dc:creator><pubDate>Wed, 06 Aug 2014 13:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 14:01:43 GMT]]></title><description><![CDATA[<p>vielleicht sollte ich mal sagen was ich vor habe:<br />
Ich will eine Memberfunktion, deren Signatur mir bekannt ist, Detouren. Allerdings stoße ich ständig auf Bugs und Sachen die laut C++-Spec &quot;verboten&quot; sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412267</guid><dc:creator><![CDATA[template pointer]]></dc:creator><pubDate>Wed, 06 Aug 2014 14:01:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 14:18:06 GMT]]></title><description><![CDATA[<p>so komme ich an die Adresse:</p>
<pre><code>DWORD dwFuncAddr = 0;
auto fp = &amp;T::func;
__asm
{
	mov eax, fp;
	mov dwFuncAddr, eax;
}
typedef int(__cdecl *tfp_func)(type1&amp;, type2*);
tfp_func pRealFp = reinterpret_cast&lt;tfp_func&gt;(dwFuncAddr);
</code></pre>
<p>Wenn ich mir das im Debugger mit der Maus über pRealFp fahre, steht da:</p>
<pre><code>pRealFp = 0x0fabbb2f {Name.dll![thunk]:Klasse::`vcall'{8,{flat}}' }'}
</code></pre>
<p>Was bedeutet dies, da wenn ich pRealFp aufrufe, komme ich nicht zur richtigen Stelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412268</guid><dc:creator><![CDATA[template pointer]]></dc:creator><pubDate>Wed, 06 Aug 2014 14:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 15:28:00 GMT]]></title><description><![CDATA[<p>template pointer schrieb:</p>
<blockquote>
<p>Das Problem ist mir bekannt, nur kenne ich die Lösung nicht. Das einzigste was mir einfallen würde wäre, über GetProcAddres, aber muss doch auch ohne gehen.</p>
</blockquote>
<p>Also ihr wollt einen Class::*member umwandeln in einen int?<br />
Das geht meines Wissens nach nur mit einem Union.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412273</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Wed, 06 Aug 2014 15:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 17:53:30 GMT]]></title><description><![CDATA[<p>template pointer schrieb:</p>
<blockquote>
<p>Das Problem ist mir bekannt, nur kenne ich die Lösung nicht. Das einzigste was mir einfallen würde wäre, über GetProcAddres, aber muss doch auch ohne gehen.</p>
</blockquote>
<p>Muss nicht passen.<br />
Der Memberfunktionszeiger könnte vielleicht sowas sein wie</p>
<pre><code>struct MFZ{
   bool virtelleFunktionOderNicht;
   void* adresse;//wird nur bei nichtvirtuellen genommen
   int indexInDerVtbl;//wird immer bei virtuellen genummen
   size_t offsetVomVprtZuThis;//Vptr stehe mal am Anfang der des Basisklassenobjekts
   //wird's bei mehrfacher Erblichkeit noch schlimmer?
};
</code></pre>
<p>Ich würde nicht erwarten, daß in einen int reindrücken und später wieder extrahieren zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412288</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 06 Aug 2014 17:53:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template Pointer on Wed, 06 Aug 2014 19:24:01 GMT]]></title><description><![CDATA[<p>nurf schrieb:</p>
<blockquote>
<p>template pointer schrieb:</p>
<blockquote>
<p>Das Problem ist mir bekannt, nur kenne ich die Lösung nicht. Das einzigste was mir einfallen würde wäre, über GetProcAddres, aber muss doch auch ohne gehen.</p>
</blockquote>
<p>Also ihr wollt einen Class::*member umwandeln in einen int?<br />
Das geht meines Wissens nach nur mit einem Union.</p>
</blockquote>
<p>Ich will mit dem Pointer auf die Member-Function zuerst die Funktion Detouren (um etwas aus dem ersten Parameter der Funktion einen Wert zu extrahieren (könnte man auch mit Mid-Funktions-Hooking machen, wodurch das ganze kack casten, womit ich nur Probleme habe, wegfallen würde, nur wäre es dann noch komplizierter mit Adressen und Patch-Code)) und anschließend so aufrufen, dass ich das ich mit einem __cdecl-Call (indem ich den Pointer eines Objekts in ecx über inline-assembler ablege) von dem Member-Function-Pointer aufrufe.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>template pointer schrieb:</p>
<blockquote>
<p>Das Problem ist mir bekannt, nur kenne ich die Lösung nicht. Das einzigste was mir einfallen würde wäre, über GetProcAddres, aber muss doch auch ohne gehen.</p>
</blockquote>
<p>Muss nicht passen.<br />
Der Memberfunktionszeiger könnte vielleicht sowas sein wie</p>
<pre><code>struct MFZ{
   bool virtelleFunktionOderNicht;
   void* adresse;//wird nur bei nichtvirtuellen genommen
   int indexInDerVtbl;//wird immer bei virtuellen genummen
   size_t offsetVomVprtZuThis;//Vptr stehe mal am Anfang der des Basisklassenobjekts
   //wird's bei mehrfacher Erblichkeit noch schlimmer?
};
</code></pre>
<p>Ich würde nicht erwarten, daß in einen int reindrücken und später wieder extrahieren zu können.</p>
</blockquote>
<p>Irgendwo habe ich das schon mal gesehen, CodeProjekt oder so, wo es ein Tut gibt, wie man eine Memberfunktion über GetProcAddress aufruft.<br />
Ich habe schon versucht den Pointer nochmal zu dereferenzieren^^. Aber an die V-Table müsste ich ja kommen.<br />
Die Theorie kling so einfach, aber der Compiler machts einem einfach so verdammt schwer an die kack Adresse zu kommen, ich verstehe nicht ganz wieso, da ich ja ganz explizit sagen kann, welche Funktion ich will und die Funktion liegt ja auch irgendwo im Speicher...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2412296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2412296</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Wed, 06 Aug 2014 19:24:01 GMT</pubDate></item></channel></rss>