<?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[Macros]]></title><description><![CDATA[<p>Hi,<br />
ich habe gerade etwas über Macros gelesen und bin mir nicht sicher, was für einen Sinn die denn in C++ haben.<br />
Warum sollte ich ein Macro schreiben, wenn ich das auch einfach als normalen Code schreiben könnte?<br />
Ich weis, dass es etwas mit dem Prärozessor zu tun hat und der Art- und Weise wie dieser etwas übersetzt, verstehe aber nicht wirklich den Sinn und wann man Macros anwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264609/macros</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 15:37:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264609.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Apr 2010 22:44:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 22:44:48 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe gerade etwas über Macros gelesen und bin mir nicht sicher, was für einen Sinn die denn in C++ haben.<br />
Warum sollte ich ein Macro schreiben, wenn ich das auch einfach als normalen Code schreiben könnte?<br />
Ich weis, dass es etwas mit dem Prärozessor zu tun hat und der Art- und Weise wie dieser etwas übersetzt, verstehe aber nicht wirklich den Sinn und wann man Macros anwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880304</guid><dc:creator><![CDATA[Honky]]></dc:creator><pubDate>Fri, 09 Apr 2010 22:44:48 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 22:49:34 GMT]]></title><description><![CDATA[<p>Honky schrieb:</p>
<blockquote>
<p>Hi,<br />
ich habe gerade etwas über Macros gelesen und bin mir nicht sicher, was für einen Sinn die denn in C++ haben.<br />
Warum sollte ich ein Macro schreiben, wenn ich das auch einfach als normalen Code schreiben könnte?<br />
Ich weis, dass es etwas mit dem Prärozessor zu tun hat und der Art- und Weise wie dieser etwas übersetzt, verstehe aber nicht wirklich den Sinn und wann man Macros anwendet.</p>
</blockquote>
<p>Makros sind in C++ nur für Include-Guards und bedingte Kompilation gut.</p>
<p>Include-Guard:</p>
<pre><code class="language-cpp">#ifndef FOO_HEADER
#define FOO_HEADER

// Declarations

#endif
</code></pre>
<p>Bedingte Kompilation:</p>
<pre><code class="language-cpp">#ifdef WIN32
// Compile this code only on Windows machines
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1880305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880305</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 09 Apr 2010 22:49:34 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 22:57:54 GMT]]></title><description><![CDATA[<p>Manche Makros lassen sich nicht als normaler code, d.h. eine Funktion schreiben, z.B. wenn das Makro ein Template beinhaltet.</p>
<pre><code class="language-cpp">#define REGISTER_MAKRO(function, name) \
        Register(function, SomeTemplate::MyTemplate&lt;function&gt;, name)
</code></pre>
<p>Wüsste nicht, wie man das ohne Makro lösen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880307</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Fri, 09 Apr 2010 22:57:54 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:00:34 GMT]]></title><description><![CDATA[<p>Kleiner Troll schrieb:</p>
<blockquote>
<p>Manche Makros lassen sich nicht als normaler code, d.h. eine Funktion schreiben, z.B. wenn das Makro ein Template beinhaltet.</p>
<pre><code class="language-cpp">#define REGISTER_MAKRO(function, name) \
        Register(function, SomeTemplate::MyTemplate&lt;function&gt;, name)
</code></pre>
<p>Wüsste nicht, wie man das ohne Makro lösen sollte.</p>
</blockquote>
<p>Das ist ein häßlicher, unnötiger und unsicherer Hack. Sowas gehört verboten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880310</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:02:31 GMT]]></title><description><![CDATA[<p>Deine hervorragenden Argumente sind zugegebenermaßen kaum zu widerlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880311</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:02:31 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:03:51 GMT]]></title><description><![CDATA[<p>Kleiner Troll schrieb:</p>
<blockquote>
<p>Deine hervorragenden Argumente sind zugegebenermaßen kaum zu widerlegen.</p>
</blockquote>
<p>Makros sind reine Text-Substitution. Statt dieses dämliche Makro zu nutzen kannst du gleich den Code hinschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880313</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:11:15 GMT]]></title><description><![CDATA[<p>Ist halt unnötigerweise länger, mehr Arbeit und de facto unübersichtlicher.<br />
Klar kann man das jedesmal so hinschreiben.<br />
Man kann auch statt eine Funktion zu schreiben und als inline zu deklarieren jedesmal den code selbst einfügen.<br />
Ich kann auch jedes template manuel zusammenbaun, brauch ich die template möglichkeit von c++ gar nicht mehr.<br />
Das geht schon, nur Sinn machts keinen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880315</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:13:02 GMT]]></title><description><![CDATA[<p>Muss ich Janjan Recht geben. Markos sollten in C++ für so etwas nicht genutzt werden... Das war mal C <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/1880316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880316</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:13:02 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:28:46 GMT]]></title><description><![CDATA[<p>abgesehen vom genannten, wobei das von Kleiner Troll auch ohne makro geht,</p>
<p>manchmal braucht man automatisch generierte unterschiedliche bezeichner, da nimmt man manchmal __count__ oder __line__ und makros.</p>
<p>manchmal braucht man bezeichner und den bezeichner als string, zum beispiel für factories.</p>
<p>oder auch zum testen</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#define SHOW(name) cout&lt;&lt;#name&lt;&lt;&quot; = &quot;&lt;&lt;(name)&lt;&lt;'\n';

int main(){
	int x=5;
	int y=7/x;
	double z=y*x;
	SHOW(x);
	SHOW(y);
	SHOW(x==y);
}
</code></pre>
<p>Ausgabe</p>
<pre><code>x = 5
y = 1
x==y = 0
</code></pre>
<p>und natürlich für assert und konsorten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880321</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:28:46 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:23:16 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten <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="🙂"
    /><br />
Jetz verstehe ich wenigstens Sinn und Zweck dieser Makros.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880322</guid><dc:creator><![CDATA[Honky]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:23:16 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:26:33 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>abgesehen vom genannten, wobei das von Kleiner Troll auch ohne makro geht</p>
</blockquote>
<p>Hm? Meinst du einfach austippen? Ja, geht. Oder hast du eine andere Lösung im Kopf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880324</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:49:49 GMT]]></title><description><![CDATA[<p>Kleiner Troll schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>abgesehen vom genannten, wobei das von Kleiner Troll auch ohne makro geht</p>
</blockquote>
<p>Hm? Meinst du einfach austippen? Ja, geht. Oder hast du eine andere Lösung im Kopf?</p>
</blockquote>
<p>Was spricht gegen:</p>
<pre><code class="language-cpp">template&lt;typename Function, typename T&gt;
void Register(Function function, T const&amp; name) {
  Register_helper(function, SomeTemplate::MyTemplate&lt;Function&gt;, name);
}
</code></pre>
<p>wobei mir hier der Sinn komplett unklar ist.</p>
<p>oder meintest du statt</p>
<pre><code class="language-cpp">#define REGISTER_MAKRO(function, name) \
        Register(function, SomeTemplate::MyTemplate&lt;function&gt;, name)
</code></pre>
<p>doch</p>
<pre><code class="language-cpp">#define REGISTER_MAKRO(function, name) \
        Register(#function, SomeTemplate::MyTemplate&lt;function&gt;(), name)
</code></pre>
<p>??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880329</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:48:42 GMT]]></title><description><![CDATA[<p>Kleiner Troll schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>abgesehen vom genannten, wobei das von Kleiner Troll auch ohne makro geht</p>
</blockquote>
<p>Hm? Meinst du einfach austippen? Ja, geht. Oder hast du eine andere Lösung im Kopf?</p>
</blockquote>
<p>Du hast nicht klargemacht, was</p>
<pre><code class="language-cpp">Register(function,SomeTemplate::MyTemplate&lt;function&gt;,name);
</code></pre>
<p>tun soll.<br />
Aber so frißt es mein Compiler nicht, fürchte ich. Der zweite Parameter scheint nur ein Typ zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880334</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:48:42 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:58:05 GMT]]></title><description><![CDATA[<p>Manchmal können Macros einen einfach Tipparbeit abnehmen. Das DRY-Prinzip kann bis zu einem gewissen Grad auch hier agewendet werden. Kleines Beispiel, das ich benutze um einen enum-Wert auf einen Typen zu mappem:</p>
<pre><code class="language-cpp">template &lt;CommandID ID&gt;
struct CommandID2Type
{
  typedef EmptyType type;
};

#define MAPCOMMANDID(id, mappedtype) \
                                     \
template &lt;&gt;                          \
struct CommandID2Type&lt;id&gt;            \
{                                    \
  typedef mappedtype type;           \
}

MAPCOMMANDID(ERROR, std::string);
MAPCOMMANDID(OUTPUT, std::string);
MAPCOMMANDID(PLAYER_INFO_OPEN, std::vector&lt;OpenPlayerInfo&gt;);
MAPCOMMANDID(TABLE_INFO, TableInfo);
MAPCOMMANDID(TURN_INFO, TurnInfo);

MAPCOMMANDID(PLAY_CARD, CardID);
MAPCOMMANDID(SETUP_PLAYERS, std::vector&lt;std::string&gt;);
#undef MAPCOMMANDID
</code></pre>
<p>jedesmal das stuct komplett auszuschreiben wäre doch ein wenig länglich, so sieht man sofort was passiert, und die Wirkunsweise ist dank #undef begrenzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880339</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:58:05 GMT]]></title><description><![CDATA[<p>Das ganze ist ein bisschen Ansichtssache - man kann mit Makros viel Schindluder treiben, aber das gilt für so ziemlich alles.</p>
<p>Mein Standpunkt ist, dass man Makros mit Vorsicht behandeln sollte, weil es sehr leicht ist, damit zu verschleiern, was eigentlich passiert, wodurch der Code sehr unübersichtlich werden kann, es allerdings Zusammenhänge gibt, in denen Makros schlimmeres verhindern - beispielsweise, den selben Kram zwanzigtausendmal zu schreiben, etwa, wenn dieser sich nicht in eine Funktion auslagern lässt. Das muss dann im Einzelfall entschieden werden.</p>
<p>Konkretes Beispiel: Man schreibt ein C-API um eine C++-Kernbibliothek. Das C-API kennt keine Exceptions, also müssen die vorher abgefangen werden, und häufig in einem solchen Fall auf die gleiche Art und Weise. Da catch-Blöcke sich nicht in Funktionen auslagern lassen, besteht die Wahl bei einem ausreichend großen API dazwischen, die selben zehn oder so Zeilen in jeder Funktion wieder zu copy&amp;pasten oder ein Makro zu schreiben - in so einem Zusammenhang ist ein Makro meines Erachtens nach durchaus vertretbar. Ich berufe mich hier auf das <a href="http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself" rel="nofollow">DRY-Prinzip</a>.</p>
<p>Ansonsten gibt es gelegentlich zwischen verschiedenen Compilern Unterschiede in der...ich nenne es mal Auslegung von Standards, für die von Janjan genannten Feature-Makros nicht ausreichen (bzw. bei denen die Umsetzung mit nur diesen Feature-Makros eher unschön ist). Etwa benutze ich für TR1-Header folgendes Konstrukt:</p>
<pre><code class="language-cpp">#ifdef __GNUC__
#  define TR1_HEADER(header) &lt;tr1/header&gt;
#else
#  define TR1_HEADER(header) &lt;header&gt;
#endif

#include TR1_HEADER(memory)
#include TR1_HEADER(functional)
// ...

#undef TR1_HEADER
</code></pre>
<p>Ansonsten kann ich volkard nur zustimmen. Grundlegend ist das relevante Entscheidungskriterium Übersichtlichkeit. Wenn ich zwei Möglichkeiten zur Auswahl habe, von denen eine übersichtlich und eine unübersichtlich ist, nehme ich die unübersichtliche, völlig egal, welche Sprachmittel ich dazu benutzen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880340</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Fri, 09 Apr 2010 23:58:42 GMT]]></title><description><![CDATA[<p>function ist ein Funktionszeiger mit einer gewissen signatur a, name ist ein std::string, das template hat eine signatur b != a (der einzige Zweck des templates ist genaugenommen die Signatur zu ändern)<br />
Register nimmt nimmt einen Funktionszeiger mit Signatur a, einen mit b, und einen Namen, unter dem es die Funktion unter diesem Namen als callback an 2 voneinander unabhängigen Stellen registriert.</p>
<p>Zu Shade of Mine:</p>
<blockquote>
<p>function, SomeTemplate::MyTemplate&lt;Function&gt;, name</p>
</blockquote>
<p>und</p>
<blockquote>
<p>function, SomeTemplate::MyTemplate&lt;function&gt;, name</p>
</blockquote>
<p>Ist nicht dasselbe <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/1880341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880341</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Fri, 09 Apr 2010 23:58:42 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:03:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;cstdio&gt;
#include &lt;cstring&gt;
#include &lt;string&gt;

void oldFunc(const char *str, int len)
{
	printf(&quot;%s, len %i\n&quot;, str, len);
}

#define SHORTER_C_FUNC(x) oldFunc(x, strlen(x))

inline void betterCppFunc(const std::string&amp; str)
{
	SHORTER_C_FUNC(str.c_str());
}

inline void betterCppFunc(const char *str)
{
	SHORTER_C_FUNC(str);
}

int main()
{
	std::string test1 = &quot;bla&quot;;
	char test2[] = &quot;test&quot;;

	betterCppFunc(test1);
	betterCppFunc(test2);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1880343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880343</guid><dc:creator><![CDATA[lklöklö]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:08:42 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Ansonsten kann ich volkard nur zustimmen. Grundlegend ist das relevante Entscheidungskriterium Übersichtlichkeit. Wenn ich zwei Möglichkeiten zur Auswahl habe, von denen eine übersichtlich und eine unübersichtlich ist, nehme ich die unübersichtliche, völlig egal, welche Sprachmittel ich dazu benutzen muss.</p>
</blockquote>
<p>Das ehrt Dich. Aber ich bin um ehrlich zu sein, nicht so fleißig und nehme gelegentlich einfach die übersichtlichere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880345</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:10:30 GMT]]></title><description><![CDATA[<p>Äh...Tipfeeler. <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/1880347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880347</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:10:30 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:12:10 GMT]]></title><description><![CDATA[<p>Kleiner Troll schrieb:</p>
<blockquote>
<p>function ist ein Funktionszeiger mit einer gewissen signatur a, name ist ein std::string, das template hat eine signatur b != a (der einzige Zweck des templates ist genaugenommen die Signatur zu ändern)<br />
Register nimmt nimmt einen Funktionszeiger mit Signatur a, einen mit b, und einen Namen, unter dem es die Funktion unter diesem Namen als callback an 2 voneinander unabhängigen Stellen registriert.</p>
</blockquote>
<p>Soll Register auch ein Makro sein? Falls ja, war Dein Posting ein schwaches Argument.<br />
Fall nein, zeige eine einfache Beispielimplementierung für Register.<br />
So glaube ich noch nicht, daß die Anforderung möglich war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880348</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:12:10 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:19:34 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int Singleton::Register(SignaturEins function, SignaturZwei cFunction, const string&amp; name)
{
	if (Register(function, name) != -1)	{ 
		Register(cFunction, name);  
		return 0;
	} else {
		return -1;
	}
}
</code></pre>
<p>Im echten Beispiel sind &quot;SignaturEins/Zwei&quot; einfach typedefs für einen Funktionszeiger.<br />
Ich hoffe du hast nichts dagegen das ich die Namen etwas generalisiert habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880350</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:19:34 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:25:57 GMT]]></title><description><![CDATA[<p>Das template könnte als Beispiel so aussehen:</p>
<p>template&lt;SignaturEins T&gt; int MyTemplate(int Zahl)<br />
{<br />
std::vector&lt;int&gt; tmp;<br />
tmp.push_back(Zahl);<br />
return T(tmp);<br />
}</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880353</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:25:57 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:39:44 GMT]]></title><description><![CDATA[<p>Compilieren sollte das Programm schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880356</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 00:52:06 GMT]]></title><description><![CDATA[<p>Ach, du willst ein kompilierbares minimalbeispiel? Sag das doch gleich :&gt;<br />
Warte 10 min, ich stells zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880359</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Sat, 10 Apr 2010 00:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 01:04:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;
#define REGISTER_MAKRO(function, name) \
        Register(function, MyTemplate&lt;function&gt;, name)
using namespace std;

typedef int (*SigEins)(vector&lt;int&gt;);
typedef int (*SigZwei)(int);

template&lt;SigEins T&gt; int MyTemplate(int Zahl)
{
   vector&lt;int&gt; tmp;
   tmp.push_back(Zahl);
   return T(tmp);
}

int Register(SigEins func, const string&amp; name)
{
   //hier gehts weiter zum registrieren in die eine Richtung, wies genau geht sollte irrelevant sein
   return 0; //wir gehen davon aus das das registrieren hier erfolgreich war
   //return -1; //das wird zurückgegeben falls es nicht erfolgreich war
}

int Register(SigZwei func, const string&amp; name)
{
   //hier gehts weiter zum registrieren in die andere Richtung, wies genau geht sollte irrelevant sein
   return 0;
}

int Register(SigEins function, SigZwei cFunction, const string&amp; name)
{
    if (Register(function, name) != -1)    {
        Register(cFunction, name);  
        return 0;
    } else {
        return -1;
    }
}

int Test(vector&lt;int&gt;)
{
   return 2;
}

int main()
{
   REGISTER_MAKRO(&amp;Test, &quot;test&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1880360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880360</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Sat, 10 Apr 2010 01:04:59 GMT</pubDate></item><item><title><![CDATA[Reply to Macros on Sat, 10 Apr 2010 01:39:05 GMT]]></title><description><![CDATA[<p>Noch gehts.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;

using namespace std;

typedef int (*SigEins)(vector&lt;int&gt;);
typedef int (*SigZwei)(int);

template&lt;SigEins T&gt; int MyTemplate(int Zahl)
{
   vector&lt;int&gt; tmp;
   tmp.push_back(Zahl);
   return T(tmp);
}

int Register(SigEins func, const string&amp; name)
{
   //hier gehts weiter zum registrieren in die eine Richtung, wies genau geht sollte irrelevant sein
   return 0; //wir gehen davon aus das das registrieren hier erfolgreich war
   //return -1; //das wird zurückgegeben falls es nicht erfolgreich war
}

int Register(SigZwei func, const string&amp; name)
{
   //hier gehts weiter zum registrieren in die andere Richtung, wies genau geht sollte irrelevant sein
   return 0;
}

int Register(SigEins function, SigZwei cFunction, const string&amp; name)
{
    if (Register(function, name) != -1)    {
        Register(cFunction, name);
        return 0;
    } else {
        return -1;
    }
}

int Test(vector&lt;int&gt;)
{
   return 2;
}

#define REGISTER_MAKRO(function, name) \
        Register(function, MyTemplate&lt;function&gt;, name)

//alles oberhalb unveränder, außer das makro runtergezogen zum besser 
//anschauen können, während ich das template zusammenfrickle. 

template&lt;SigEins FUNC&gt;
void REGISTER_TEMPLATE(const string&amp; name){
	Register(FUNC,MyTemplate&lt;FUNC&gt;,name);
}

int main()
{
   REGISTER_MAKRO(&amp;Test, &quot;test&quot;);
   REGISTER_TEMPLATE&lt;&amp;Test&gt;(&quot;test&quot;);
}
</code></pre>
<p>Wenn die function auch andere Signaturen als SigEins haben können soll, wird der Aufruf in der main aber schon häßlicher. Da mache ich mich dann aber auch locker und denke an Makros.</p>
<p>Aber spaßig wird's mit</p>
<pre><code class="language-cpp">#define REGISTER_MAKRO2(function) \
        Register(function, MyTemplate&lt;function&gt;, #function)

int main()
{
   REGISTER_MAKRO(&amp;Test, &quot;test&quot;);
   REGISTER_TEMPLATE&lt;&amp;Test&gt;(&quot;test&quot;);
   REGISTER_MAKRO2(Test);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1880363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880363</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Apr 2010 01:39:05 GMT</pubDate></item></channel></rss>