<?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[Makroästhetik]]></title><description><![CDATA[<p>Okay, der Thread hätte eher &quot;Makro-Ästhetik&quot; heißen sollen <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>Derzeit schreibe ich für ein Projekt einige Makros und Template-Klassen, die das Implementieren und Benutzen von Interfaces im COM-Stil vereinfachen. Gegenwärtig sieht das so aus:</p>
<pre><code class="language-cpp">UCL_DECL_INTERFACE (imgeval::, IDataPointInfo, ucl::oo::IInterface,
    &quot;{9A63B541-6E23-4995-9740-28FE1DCC54DA}&quot;)
{
    UCL_DECL_FUNC0 (DataTypeT, GetType)
    UCL_DECL_PROC1 (SetType, DataTypeT,type)
    ...
};

class DataPointInfo : public IDataPointInfo
{
private:
    DataTypeT dataType;

public:
    UCL_IMPL_QUERYINTERFACE (DataPointInfo, void /* d.h. keine Basisklasse */, IDataPointInfo)
    UCL_IMPL_ADDREF_RELEASE

    UCL_DEF_FUNC0 (DataTypeT, GetType)
    { return dataType; }
    ...
};
</code></pre>
<p>Die meisten Aspekte stehen bereits zur Zufriedenheit - das meiste hat sich nach einiger Benutzung der Makros eingependelt -, aber ein ästhetisches Problem bleibt: es ist verdammt schwer, in obiger Notation auf Anhieb zwischen Prozeduren und Funktionen zu unterscheiden, z.B.: ist SetType bei der zweiten Methode Rückgabewert oder Methodenname? Die Differentation in UCL_DECL_PROCx und UCL_DECL_FUNCx ist leider (meinem gegenwärtigen Kenntnisstand zufolge) makrotechnisch notwendig, da beide Makros zu einer OLE-konformen Methode (mit HRESULT-Rückgabewert) expandiert werden, also etwa so (stark verkürzt):</p>
<pre><code class="language-cpp">struct IDataPointInfo : ucl::oo::IInterface
{
    inline DataTypeT GetType (void)
    {
        DataTypeT retval;
        HRESULT hresult;
        if ((hresult = _GetType (retval)) != 0)
            ucl::oo::ESafecallException::raise (hresult);
        return retval;
    }
    virtual HRESULT __stdcall _GetType (DataTypeT&amp; retval) = 0;
    inline void SetType (DataTypeT type)
    {
        HRESULT hresult;
        if ((hresult = _GetType (type)) != 0)
            ucl::oo::ESafecallException::raise (hresult);
    }
    virtual HRESULT __stdcall _SetType (DataTypeT type) = 0;
    ...
};
</code></pre>
<p>Entsprechend generieren UCL_DEF_FUNCx und UCL_DEF_PROCx Exception-Handler um die Funktion herum.</p>
<p>Hat jemand Vorschläge, wie ich eine deutlichere Unterscheidbarkeit forcieren könnte? (Es komme bitte niemand mit der Idee, bei Prozeduren den Namen einfach einzurücken.) Ideal wäre, wenn ich</p>
<pre><code class="language-cpp">UCL_DECL_FUNC1 (void, SetType, DataTypeT,type)
</code></pre>
<p>benutzen könnte, aber ich wüßte nicht, wie das gehen sollte. Und</p>
<pre><code class="language-cpp">UCL_DECL_PROC1 (void, SetType, DataTypeT,type)
</code></pre>
<p>möchte ich auch vermeiden, weil es redundant und damit fehleranfällig ist.</p>
<p><em>Edit:</em> Kleinigkeiten (DECL &lt;&gt; DEF)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240103/makroästhetik</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 03:41:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240103.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 May 2009 21:40:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Makroästhetik on Fri, 01 May 2009 21:43:04 GMT]]></title><description><![CDATA[<p>Okay, der Thread hätte eher &quot;Makro-Ästhetik&quot; heißen sollen <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>Derzeit schreibe ich für ein Projekt einige Makros und Template-Klassen, die das Implementieren und Benutzen von Interfaces im COM-Stil vereinfachen. Gegenwärtig sieht das so aus:</p>
<pre><code class="language-cpp">UCL_DECL_INTERFACE (imgeval::, IDataPointInfo, ucl::oo::IInterface,
    &quot;{9A63B541-6E23-4995-9740-28FE1DCC54DA}&quot;)
{
    UCL_DECL_FUNC0 (DataTypeT, GetType)
    UCL_DECL_PROC1 (SetType, DataTypeT,type)
    ...
};

class DataPointInfo : public IDataPointInfo
{
private:
    DataTypeT dataType;

public:
    UCL_IMPL_QUERYINTERFACE (DataPointInfo, void /* d.h. keine Basisklasse */, IDataPointInfo)
    UCL_IMPL_ADDREF_RELEASE

    UCL_DEF_FUNC0 (DataTypeT, GetType)
    { return dataType; }
    ...
};
</code></pre>
<p>Die meisten Aspekte stehen bereits zur Zufriedenheit - das meiste hat sich nach einiger Benutzung der Makros eingependelt -, aber ein ästhetisches Problem bleibt: es ist verdammt schwer, in obiger Notation auf Anhieb zwischen Prozeduren und Funktionen zu unterscheiden, z.B.: ist SetType bei der zweiten Methode Rückgabewert oder Methodenname? Die Differentation in UCL_DECL_PROCx und UCL_DECL_FUNCx ist leider (meinem gegenwärtigen Kenntnisstand zufolge) makrotechnisch notwendig, da beide Makros zu einer OLE-konformen Methode (mit HRESULT-Rückgabewert) expandiert werden, also etwa so (stark verkürzt):</p>
<pre><code class="language-cpp">struct IDataPointInfo : ucl::oo::IInterface
{
    inline DataTypeT GetType (void)
    {
        DataTypeT retval;
        HRESULT hresult;
        if ((hresult = _GetType (retval)) != 0)
            ucl::oo::ESafecallException::raise (hresult);
        return retval;
    }
    virtual HRESULT __stdcall _GetType (DataTypeT&amp; retval) = 0;
    inline void SetType (DataTypeT type)
    {
        HRESULT hresult;
        if ((hresult = _GetType (type)) != 0)
            ucl::oo::ESafecallException::raise (hresult);
    }
    virtual HRESULT __stdcall _SetType (DataTypeT type) = 0;
    ...
};
</code></pre>
<p>Entsprechend generieren UCL_DEF_FUNCx und UCL_DEF_PROCx Exception-Handler um die Funktion herum.</p>
<p>Hat jemand Vorschläge, wie ich eine deutlichere Unterscheidbarkeit forcieren könnte? (Es komme bitte niemand mit der Idee, bei Prozeduren den Namen einfach einzurücken.) Ideal wäre, wenn ich</p>
<pre><code class="language-cpp">UCL_DECL_FUNC1 (void, SetType, DataTypeT,type)
</code></pre>
<p>benutzen könnte, aber ich wüßte nicht, wie das gehen sollte. Und</p>
<pre><code class="language-cpp">UCL_DECL_PROC1 (void, SetType, DataTypeT,type)
</code></pre>
<p>möchte ich auch vermeiden, weil es redundant und damit fehleranfällig ist.</p>
<p><em>Edit:</em> Kleinigkeiten (DECL &lt;&gt; DEF)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704278</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 01 May 2009 21:43:04 GMT</pubDate></item><item><title><![CDATA[Reply to Makroästhetik on Sun, 03 May 2009 18:49:36 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Ideal wäre, wenn ich</p>
<pre><code class="language-cpp">UCL_DECL_FUNC1 (void, SetType, DataTypeT,type)
</code></pre>
<p>benutzen könnte, aber ich wüßte nicht, wie das gehen sollte.</p>
</blockquote>
<p>So, ich bin mittlerweile darauf gekommen, daß und wie es mit ein wenig Präprozessormagie doch funktionieren kann:</p>
<pre><code class="language-cpp">#define UCL_PP_IS_VOID(type) \
  UCL_PP_PAIR(UCL_PP_2ND, (UCL_PP_CAT2(UCL_PP_IS_VOID_TST_, type, 0, 0)))
#define UCL_PP_IS_VOID_TST_void 0, 1,
</code></pre>
<p>Danke dennoch für die zahlreichen Reaktionen <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/1704944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704944</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 03 May 2009 18:49:36 GMT</pubDate></item></channel></rss>